假设我已经编写了无数个 puppet 模块,并且我在一个 git 存储库中拥有它们的全部历史记录,但现在我真的希望为每个模块创建一个存储库。划分文件结构很容易,因为每个文件都完全包含在自己的目录中,并且组织方式类似于GIT_ROOT /modules/ NAME。
有没有一种方法可以分割这个存储库而不丢失每个模块的历史记录?理想情况下,每个存储库仅具有与其代表的模块相关的历史记录。我尝试克隆整个事物以及git rm -rf所有不相关但保留不相关历史的内容。
我计划用 git 子模块将它们重新粘在一起,FWIW。
我一直在玩这个,看起来分割它的最简单方法是使用git subtree split:
分裂
从子树的历史记录中提取新的综合项目历史记录。新历史记录仅包括影响 的提交(包括合并),并且每个提交现在都在项目根目录而不是子目录中具有 的内容。因此,新创建的历史记录适合导出为单独的 git 存储库。
因此,举例来说,如果我从openstack-puppet-modules存储库开始,其中包含一堆单独的 puppet 模块,我可以首先将它们分成像这样的单独分支(为了保持简短,我在这里只使用八个模块) :
for x in apache aviator ceilometer certmonger cinder common \
concat firewall; do
git subtree split -P $x -b split-$x
done
Run Code Online (Sandbox Code Playgroud)
运行完成后,我有:
$ git branch | grep split-
split-apache
split-aviator
split-ceilometer
split-certmonger
split-cinder
split-common
split-concat
split-firewall
split-pacemaker
Run Code Online (Sandbox Code Playgroud)
每个分支仅包含特定目录的历史记录。如果我想将它们转换为单独的存储库,我可以这样做:
for x in apache aviator ceilometer certmonger cinder common \
concat firewall; do
git init --bare ../repos/repo-$x
git push ../repos/repo-$x split-$x:master
done
Run Code Online (Sandbox Code Playgroud)
现在我有一个存储库的集合:
$ ls ../repos/
repo-apache repo-aviator repo-ceilometer repo-certmonger
repo-cinder repo-common repo-concat repo-firewall work-cinder
Run Code Online (Sandbox Code Playgroud)
我认为我们已经实现了您的目标。
| 归档时间: |
|
| 查看次数: |
866 次 |
| 最近记录: |