如何干净地拆分Git存储库?

时间:2010-08-20 11:04:39

标签: git git-filter-branch

This question带走了我的一部分,但我仍然缺少一些东西。

我有一个单用户存储库(因此重写历史与推/拉没有问题),我已经开发了产品代码并支持代码和文档。

经过一年左右的工作,我终于看到了光明,并希望将我的回购分成两部分。这就是我试过的:

  1. 在项目根目录下创建两个新目录;我们称之为项目/代码/和项目/支持/
  2. git将所有代码填入代码/
  3. git将所有支持内容放入Support /
  4. 适当地复制和修改.gitignore
  5. 提交一切
  6. 现在,当我运行我认为正确的命令时:

    git filter-branch -d /cygdrive/z/temp/ --subdirectory-filter Code/ -- --all
    

    我只是通过一次提交得到一个分离的分支,我的原始分支仍在那里(如original/refs/head/brent),所有其他分支都是原样。

    我真正需要的是重写历史记录,好像Code /目录“总是在那里”,而Support / stuff不是,反之亦然。

    我是一个相对的Git noob,所以我确定我错过了一些重要的概念 - 请填写我。


    好的,我已经做到了,它似乎做得非常好,非常感谢。我有几个补充:

    1. 我添加了-r以允许删除完整目录。它是否正确?我使用的实际命令是:

      git filter-branch --index-filter \
          'git rm -r --cached --ignore-unmatch'\
           - --all

    2. 现在,存储库的提交量大约是我预期的两倍。它们出现在gitk中,因为它被链接到名称为“original / refs / heads / TestSys”的东西。
    3. 我假设这些是原始的提交树;我怎么摆脱他们?它们不会出现在fsck中,并且prune和gc -aggressive都不能摆脱它们。


      噢,哦,看完精美的手册;打算尝试使用git clone修剪残缺。


      好的,现在我已经完成了克隆,并且存储库已缩小回原始大小。克隆似乎只复制当前(源代码库)HEAD的分支信息,我不得不手动设置其他分支:

      for n in `git branch -r|grep -v 'HEAD'` ; do git branch ${n/origin?/} $n ; done 
      

      在克隆时有没有一种简单的方法可以做到这一点?

      另外:我不希望看起来忘恩负义,但现在有“空”提交,只用于触摸现在已经消失的文件。

      有没有简单的方法来消除这些?

      真的很感谢你的帮助和耐心。

1 个答案:

答案 0 :(得分:3)

我认为将文件移动到子目录中是问题 - git在移动之前不会跟随它们。我建议从旧的存储库中克隆两个新的存储库,然后在每个存储库中运行:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch <list of files that shouldnt be here>' -- --all