与已经过滤分支的repo合并后的重复提交:ed

时间:2014-10-01 13:31:59

标签: git git-commit git-filter-branch

我不得不在git repo上应用filter-branch,由于某种原因,似乎已经与旧的哈希合并,这导致每个文件的树看起来像这样:

-.  .--A--B--C-....-X--Y--Z
  \--A'-B'-C'-...-X'

带有素数的提交字母是相应字母的副本,只是使用不同的SHA1哈希值。 在应用了filter-branch之后一直有提交,这使得很难重做filter-branch(图中的Y,Z),所以我的问题是,有没有办法删除重复的提交?

编辑:更新了树的布局,注意到这两条路径并没有真正共享一个共同的祖先。

3 个答案:

答案 0 :(得分:0)

使用您当前的设置,将分支指向Z.不要在A',B',C',X'提交。

Git将负责其余部分。

快乐的Gitting!

答案 1 :(得分:0)

您应该将分支指向提交Z,并删除任何指向A'X'的分支/标记。然后,提交对象A'X'将无法从任何引用(例如分支和标记)访问,但只能reflog。并且reflog有到期时间。在reflog到期后,它们将成为真正无法访问的对象,默认为90天。 git gc将自动删除这些无法访问的对象。您无需关心它,因为git会自动处理。

PS。所有这些行为实际上都是可配置的。有关详细信息,请参阅http://git-scm.com/docs/git-gc

[更新] 以下是删除无法访问的提交对象的步骤。

查看仅A'引用的提交对象X'reflog

git fsck --unreachable --no-reflogs

然后,您可以使用git reflog expire删除相关的reflog并使其真正无法访问。

git reflog expire --expire-unreachable=now --all

现在,您可以使用以下命令显示无法访问的对象。

git fsck --unreachable

要删除这些无法访问的对象,只需运行git prune

git prune

您还可以使用git gc删除这些无法访问的对象。它会同时打包物品。

git gc --prune=now

答案 2 :(得分:0)

我没有在图表中看到合并。

当你运行filter-branch时,git会自动将它处理的所有refs的副本复制到refs / original /。在git gc核对原始提交之前,您需要删除所有这些引用并过期reflog。