我不得不在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过期。