This question带我走了一部分,但我仍然错过了一些东西。
我有一个单用户存储库(因此重写历史记录与推/pull 相比没有问题),我在其中一起开发了产品代码以及支持代码和文档。
经过一年左右的工作,我终于看到了曙光,并想将我的存储库一分为二。这是我尝试过的:
- 在项目根目录下新建两个目录;我们称它们为“项目/代码/”和“项目/支持/”
- git mv 将所有代码内容放入 Code/
- git mv 将所有支持内容放入支持/
- 适当复制并修改 .gitignore
- promise 一切
现在,当我运行我认为正确的命令时:
git filter-branch -d /cygdrive/z/temp/ --subdirectory-filter Code/ -- --all
我只是通过一次提交获得了一个分离的分支,我的原始分支仍然存在(如original/refs/head/brent
),并且所有其他分支都保持原样。
我真正需要的是重写历史的东西,就好像 Code/目录“总是在那里”,而 Support/目录则不然,反之亦然。
我是一个相对的 Git 菜鸟,所以我确信我错过了一些重要的概念——请补充我。
好的,我已经做到了,而且它似乎很好地满足了我的需要,非常感谢。我有一些补充:
我添加了 -r 以允许删除完整的目录。它是否正确?我实际使用的命令是:
git 过滤器分支 --index-filter\
'git rm -r --cached --ignore-unmatch '\
-- --全部- 存储库现在的提交数量大约是我预期的两倍。这些在 gitk 中显示为从名称如“original/refs/heads/TestSys”的事物链接回来。
我假设这些是原始的提交树;我该如何摆脱它们?它们不会出现在 fsck 中,并且 prune 和 gc --aggressive 都不会删除它们。
呃-哦,只需阅读精美的手册即可;将尝试 git clone 来修剪多余的东西。
好的,现在我已经完成了克隆,并且存储库已缩小回其原始大小。克隆似乎只复制当前(源存储库)HEAD 的分支信息,我必须使用以下命令手动设置其他分支:
for n in `git branch -r|grep -v 'HEAD'` ; do git branch ${n/origin?/} $n ; done
有没有一种简单的方法可以在克隆时执行此操作?
另外:我不想显得忘恩负义,但现在有“空”提交,这些提交仅用于触摸现在已经消失的文件。
有没有简单的方法可以消除这些?
非常感谢您的帮助和耐心。
最佳答案
我认为将文件移动到子目录中是问题所在 - git 在移动之前不会跟随它们。我建议从旧存储库克隆两个新存储库,并在每个存储库中运行以下命令:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch <list of files that shouldnt be here>' -- --all
关于git - 如何干净地分割 Git 存储库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3530268/