我一直在尝试使用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日志输出中。
你的历史记录中已经有错误提交,你需要在继续之前将其删除
让我们假设你master
最后一次提交被转移并且无法做任何其他事情(我真的看不到你的分支,所以我需要假设一些事情开始)
您可以签出到上一个提交并将分支标记后退 1 步(或后退 X 步),这在任何情况下都是无害的,然后再次拉取
例如
git checkout master~1
git branch master -f
git checkout master
git pull
Run Code Online (Sandbox Code Playgroud)
git checkout master~1
要检查 master 的父提交,git 警告我们已脱离分支git branch master -f
强制当前 checkout 再次成为 master,即它实际上将 master 分支倒回到其先前的提交(或 X 先前的提交),从这里开始,无论上游是否强制,我们都可以正常恢复,甚至如果需要,返回到上面的步骤,我们只能再次拉取 master,而不会丢失上游的任何内容(对我们来说也可以是只读的,我们不会为此推送任何内容)git checkout master
位于我们的“倒带”主分支上,我们正在执行相同的提交,但现在位于分支上git pull
再次拉主控(可以有或没有--prune
),如果上游转移,我们将从这里回到正轨,如果没有,我们会得到与我们相同的结果,如果我们得到相同的结果并且不应该,也许我们需要返回到上面的第一步并倒带更多提交,例如git checkout master~5
或其他(根据需要) 归档时间: |
|
查看次数: |
152 次 |
最近记录: |