具有相关历史的部分git克隆

时间:2015-02-06 01:19:35

标签: git

让我们说我已经编写了数十亿个木偶模块,我将它们的整个历史记录放在一个git仓库中,但现在我真的希望我每个模块都有一个回购。分割文件结构很容易,因为每个文件结构都完全包含在它们自己的目录中,并且组织得像 GIT_ROOT / modules / NAME

有没有办法可以将这个回购分开,而不是每个模块的历史记录都没有?理想情况下,每个仓库只有与其所代表的模块相关的历史记录。我尝试克隆整个事情并git rm -rf所有与之无关的事情,但保留了无关的历史。

我计划将它们与git子模块FWIW粘合在一起。

1 个答案:

答案 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

我认为我们已经实现了你的目标。