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

How to modify remote history with git filter-repo?

过去我曾使用 git filter-branch 从我的 git 历史记录中删除文件。之后,我可以强制推送以更新远程存储库。例如,从本地存储库中删除所有 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?

Why does git-filter-repo remove my remote?

The documentation explains their reasoning, in the section titled INTERNALS:

  1. We don’t want users accidentally pushing back to the original repo, as discussed in DISCUSSION. It also reminds users that since history has been rewritten, this repo is no longer compatible with the original. Finally, another minor benefit is this allows users to push with the --mirror option to their new home without accidentally sending remote tracking branches.

And how can I rewrite remote's history using git-filter-repo like I'm able to with git filter-branch?

只需使用 git remote addorigin 放回去,或者——因为命令序列中的第 3 步是 git remote rm origin——只需 重命名 origin 先改成别的名字。但是,如果您这样做,请注意第 2 步。

你说:

Adding back the remote manually puts me down a rabbit hole of other settings be invalid.

显然,您需要在此处详细介绍。

最近在 git 上工作。 遇到了同样的问题。

在 运行 git-filter-repo 之后,我的“git branch -r”returns 什么都没有。 要恢复输出, 你需要:

git remote add origin xxxxxxxxxxx
git fetch --all

然后,您将返回“git branch -r”输出。