将上游项目推到master上后,如何修复git子树?

csn*_*ate 12 git subtree

我一直在尝试使用git子树,并遇到了以下情况。

我使用git子树将一个外部项目添加到我的仓库中,我有意保留了上游项目的所有历史记录,因为我希望能够参考该项目的历史记录,并在以后为上游项目做出贡献。

事实证明,上游项目的另一个贡献者不小心将一个大文件推入了master分支。为了解决这个问题,上游项目改写了历史并将其推向了主人。在创建“ monorepo”时,我包括了该提交,并且我也想删除它。

如何更新存储库以反映子树的新历史记录?

我的第一个尝试是使用filter-branch完全删除子树和所有历史记录。

git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch upstream-project-dir' --prune-empty HEAD
Run Code Online (Sandbox Code Playgroud)

一旦删除了旧版本的子树,我就可以使用新的上游母版重新添加子树。但是,这不起作用,因为由于某种原因,提交历史记录仍显示在git日志输出中。

arh*_*hak 0

你的历史记录中已经有错误提交,你需要在继续之前将其删除

让我们假设你master最后一次提交被转移并且无法做任何其他事情(我真的看不到你的分支,所以我需要假设一些事情开始)

您可以签出到上一个提交并将分支标记后退 1 步(或后退 X 步),这在任何情况下都是无害的,然后再次拉取

例如

git checkout master~1
git branch master -f
git checkout master
git pull
Run Code Online (Sandbox Code Playgroud)
  1. git checkout master~1要检查 master 的父提交,git 警告我们已脱离分支
  2. git branch master -f强制当前 checkout 再次成为 master,即它实际上将 master 分支倒回到其先前的提交(或 X 先前的提交),从这里开始,无论上游是否强制,我们都可以正常恢复,甚至如果需要,返回到上面的步骤,我们只能再次拉取 master,而不会丢失上游的任何内容(对我们来说也可以是只读的,我们不会为此推送任何内容)
  3. git checkout master位于我们的“倒带”主分支上,我们正在执行相同的提交,但现在位于分支上
  4. git pull再次拉主控(可以有或没有--prune),如果上游转移,我们将从这里回到正轨,如果没有,我们会得到与我们相同的结果,如果我们得到相同的结果并且不应该,也许我们需要返回到上面的第一步并倒带更多提交,例如git checkout master~5或其他(根据需要)