我一直在尝试使用git子树,并遇到了以下情况。
我使用git子树将一个外部项目添加到我的仓库中,我有意保留了上游项目的所有历史记录,因为我希望能够参考该项目的历史记录,并在以后为上游项目做出贡献。
事实证明,上游项目的另一个贡献者不小心将一个大文件推入了master分支。为了解决这个问题,上游项目改写了历史并将其推向了主人。在创建“ monorepo”时,我包括了该提交,并且我也想删除它。
如何更新存储库以反映子树的新历史记录?
我的第一个尝试是使用filter-branch完全删除子树和所有历史记录。
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch upstream-project-dir' --prune-empty HEAD
一旦删除了旧版本的子树,我就可以使用新的上游母版重新添加子树。但是,这不起作用,因为由于某种原因,提交历史记录仍显示在git日志输出中。
更新资料
我已经写好了创建最小可复制示例的步骤。
首先创建一个空的git repo。
git init test-monorepo cd ./test-monorepo
创建一个初始提交。
echo hello world > README git add README git commit -m 'initial commit'
现在为外部项目添加一个子树。
git remote add thirdparty git@github.com:teivah/algodeck.git git fetch thirdparty git subtree add --prefix algodeck thirdparty master
在monorepo上进行一些提交
echo dont panic >> algodeck/README.md git commit -a -m 'test commit'
现在尝试使用git filter-branch删除子树。
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch algodeck' --prune-empty HEAD
检查git日志输出,我希望仅看到我的初始提交。
git log
git gc --prune=now
只删除未出现在其中的提交git log
?
git log
,没有任何争论,而且我仍然看到旧的提交。