This question带走了我的一部分,但我仍然缺少一些东西。
我有一个单用户存储库(因此重写历史与推/拉没有问题),我已经开发了产品代码并支持代码和文档。
经过一年左右的工作,我终于看到了光明,并希望将我的回购分成两部分。这就是我试过的:
现在,当我运行我认为正确的命令时:
git filter-branch -d /cygdrive/z/temp/ --subdirectory-filter Code/ -- --all
我只是通过一次提交得到一个分离的分支,我的原始分支仍在那里(如original/refs/head/brent
),所有其他分支都是原样。
我真正需要的是重写历史记录,好像Code /目录“总是在那里”,而Support / stuff不是,反之亦然。
我是一个相对的Git noob,所以我确定我错过了一些重要的概念 - 请填写我。
好的,我已经做到了,它似乎做得非常好,非常感谢。我有几个补充:
我添加了-r以允许删除完整目录。它是否正确?我使用的实际命令是:
git filter-branch --index-filter \
'git rm -r --cached --ignore-unmatch'\
- --all
我假设这些是原始的提交树;我怎么摆脱他们?它们不会出现在fsck中,并且prune和gc -aggressive都不能摆脱它们。
好的,现在我已经完成了克隆,并且存储库已缩小回原始大小。克隆似乎只复制当前(源代码库)HEAD的分支信息,我不得不手动设置其他分支:
for n in `git branch -r|grep -v 'HEAD'` ; do git branch ${n/origin?/} $n ; done
在克隆时有没有一种简单的方法可以做到这一点?
另外:我不希望看起来忘恩负义,但现在有“空”提交,只用于触摸现在已经消失的文件。
有没有简单的方法来消除这些?
真的很感谢你的帮助和耐心。
答案 0 :(得分:3)
我认为将文件移动到子目录中是问题 - git在移动之前不会跟随它们。我建议从旧的存储库中克隆两个新的存储库,然后在每个存储库中运行:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch <list of files that shouldnt be here>' -- --all