git - 如何干净地分割 Git 存储库?

标签 git git-filter-branch

This question带我走了一部分,但我仍然错过了一些东西。

我有一个单用户存储库(因此重写历史记录与推/pull 相比没有问题),我在其中一起开发了产品代码以及支持代码和文档。

经过一年左右的工作,我终于看到了曙光,并想将我的存储库一分为二。这是我尝试过的:

  1. 在项目根目录下新建两个目录;我们称它们为“项目/代码/”和“项目/支持/”
  2. git mv 将所有代码内容放入 Code/
  3. git mv 将所有支持内容放入支持/
  4. 适当复制并修改 .gitignore
  5. promise 一切

现在,当我运行我认为正确的命令时:

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

我只是通过一次提交获得了一个分离的分支,我的原始分支仍然存在(如original/refs/head/brent),并且所有其他分支都保持原样。

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

我是一个相对的 Git 菜鸟,所以我确信我错过了一些重要的概念——请补充我。


好的,我已经做到了,而且它似乎很好地满足了我的需要,非常感谢。我有一些补充:

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

    git 过滤器分支 --index-filter\
    'git rm -r --cached --ignore-unmatch '\
    -- --全部

  2. 存储库现在的提交数量大约是我预期的两倍。这些在 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/

相关文章:

git - 在 .gitmodules 中找不到路径的子模块映射和丢失的 .gitmodules 文件

Git:如何以其他人的身份提交?

git - 用 release 标记 git 子模块

git - git filter-branch --tree-filter与--since返回“找不到要重写的内容”

git - 为什么 filter-branch 上的 --cached 选项会从工作目录中删除文件?

带有 --subdirectory-filter 的 git filter-branch 删除所有文件

Git - 重写所有受影响的提交用户电子邮件 - 不适用于事件

php - 从 Git 存储库安装时覆盖 PHPUnit 输出中的 "@package_version@"

git - git 中修剪的区别

git filter 分支到 git filter repo 的转换