与已筛选分支的repo合并后重复提交:ed



我不得不在git repo上应用一个过滤分支,出于某种原因,似乎与旧哈希进行了合并,这导致每个文件的树看起来如下:

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

带有素数的提交字母是相应字母的副本,只是使用了不同的SHA1哈希。在应用过滤器分支后出现了提交,这使得很难重做过滤器分支(图中的Y、Z),所以我的问题是,有没有办法删除重复的提交?

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

您应该将一个分支指向提交Z,并删除指向A'X'中任何一个的任何分支/标记。然后,提交对象A'X'从任何引用(如分支和标记)变得不可访问,但只能访问reflog。CCD_ 7有失效时间。默认情况下,在reflog过期90天后,它们将成为真正无法访问的对象。git gc将自动删除这些无法访问的对象。你不需要关心它,因为git会自动处理它。

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

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

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

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

使用当前设置,将分支放置到Z。不要在a'、B'、C'、,。。X’提交。

Git会处理剩下的。

Gitting快乐!

我在您的图中没有看到合并。

运行filter分支时,git将自动将其处理的所有ref复制到refs/original/中。在git gc将核处理原始提交之前,您需要删除所有这些refs并使reflog过期。

最新更新