让我们说我已经编写了数十亿个木偶模块,我将它们的整个历史记录放在一个git仓库中,但现在我真的希望我每个模块都有一个回购。分割文件结构很容易,因为每个文件结构都完全包含在它们自己的目录中,并且组织得像 GIT_ROOT / modules / NAME 。
有没有办法可以将这个回购分开,而不是每个模块的历史记录都没有?理想情况下,每个仓库只有与其所代表的模块相关的历史记录。我尝试克隆整个事情并git rm -rf
所有与之无关的事情,但保留了无关的历史。
我计划将它们与git子模块FWIW粘合在一起。
答案 0 :(得分:1)
我一直在玩这个,看起来最简单的方法就是使用git subtree split
:
<强>分割强>
从历史记录中提取新的合成项目历史记录 子树。新的历史只包括 受影响的提交(包括合并)以及每个 那些提交现在有内容的 项目的根而不是在子目录中。就这样 新创建的历史记录适合单独导出 git repository。
所以,例如,如果我从openstack-puppet-modules存储库开始,其中包含一堆单独的木偶模块,我可以先将它们分成这样的单个分支(我这里只使用8个模块来保存)事情简短):
for x in apache aviator ceilometer certmonger cinder common \
concat firewall; do
git subtree split -P $x -b split-$x
done
一旦完成运行,我有:
$ git branch | grep split-
split-apache
split-aviator
split-ceilometer
split-certmonger
split-cinder
split-common
split-concat
split-firewall
split-pacemaker
每个分支仅包含特定的历史记录 目录。如果我想将这些转换为单独的存储库,我 可以做到这一点:
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
现在我有了一系列存储库:
$ ls ../repos/
repo-apache repo-aviator repo-ceilometer repo-certmonger
repo-cinder repo-common repo-concat repo-firewall work-cinder
我认为我们已经实现了你的目标。