如何使用git filter-repo修改远程历史记录?

16

过去我曾经使用 git filter-branch 来从我的 git 历史记录中删除文件。在此之后,我可以强制推送以更新远程仓库。例如,从本地 repo 中删除所有 HTML 文件,然后重写远程仓库以反映这一变化:

$ git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch -r \*.html' --prune-empty -- --all
$ git push origin --force --all

这个方法完全有效。但是由于filter-branch非常缓慢,并已经被弃用了一段时间,我想改用git-filter-repo来完成。目前为止,以下命令似乎是等效的:

$ git-filter-repo --force --path-glob *.html --invert-paths

这第一步似乎可以正常工作。我的问题在于,当我尝试进行强制推送后,我发现我的远程分支已经丢失了。

$ git push origin --force --all
fatal: 'origin' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

在检查 git remote -v 时,filter-repo 命令似乎已经删除了我的远程 URL。手动添加远程会导致我陷入其他设置无效的泥潭。

为什么 git-filter-repo 会删除我的远程?如何使用 git-filter-repo 重写远程历史,就像我用 git filter-branch 一样?


1
对于那些遇到类似问题的人,可能需要在运行 git filter-repo 命令之前,在 .git/config 文件中备份远程 URL 配置,并将其存储在其他地方以供以后恢复。这在 Github 的文档中有提到。 - machine-building
2个回答

14
为什么 git-filter-repo 要移除我的远程仓库?
文档INTERNALS 部分中解释了他们的原因:
  1. 我们不希望用户意外地将更改推送回原始仓库,正如DISCUSSION中所讨论的那样。它还提醒用户,由于历史记录已被重写,该仓库与原始仓库不再兼容。最后,另一个小好处是,这允许用户使用 --mirror 选项将其推送到新主机,而不会意外发送远程跟踪分支。
我如何像使用 git filter-branch 一样使用 git-filter-repo 重写远程仓库的历史记录?
只需使用 git remote addorigin 添加回去,或者——由于命令序列中的第 3 步是 git remote rm origin——首先将 origin 重命名为其他名称。如果您这样做,请注意第2步。

手动添加远程设置会导致其他设置无效,需要进一步详细说明。

显然,你需要提供更多信息。


但是我如何重写远程仓库的历史记录,同时删除远程仓库中的文件,就像在本地仓库中所做的那样?我的远程仓库增加了大小,此后并没有减小。 - João Pimentel Ferreira
1
@JoãoPimentelFerreira:git filter-repo设计用途是你要归档旧存储库并创建一个新存储库。你不会更新原始存储库。如果你确实想要更新原始存储库,那么你必须深入了解 Git。(简而言之:除非你知道自己在做什么,否则不要在过滤后更新原始存储库。) - torek
我理解了,这就是你丢失git配置文件的原因。但最终你这样做是因为想要在远程仓库中节省空间,通过用旧的远程仓库替换新的本地仓库来实现。你怎么做到的? - João Pimentel Ferreira
1
取决于远程情况。在企业服务器上,我会将旧仓库移动到某个归档备份存储中(也许在S3上?),并为新仓库创建一个新的仓库。在GitHub上,不太确定该怎么做。 - torek
我指的是确切的Github :) - João Pimentel Ferreira
@JoãoPimentelFerreira:好的,请注意GitHub从未从任何现有存储库中删除任何提交(出于GitHub内部原因)。因此,如果GitHub上的旧存储库没有明确从GitHub中删除,则所有这些提交将保留在那里占用空间。是否存在问题(以及对谁)可能会影响您的方法。最好与GitHub支持联系以获取他们的建议。 - torek

0

最近在使用Git。 遇到了同样的问题。

运行git-filter-repo后,我的“git branch -r”没有返回任何内容。 要恢复输出, 你需要:

git remote add origin xxxxxxxxxxx
git fetch --all

然后,您将会得到您的 "git branch -r" 输出结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接