>我不小心将一个大文件添加到特定分支上的 git 存储库中,并且不得不更改分支的提交历史记录以删除该文件:
git filter-branch -f --index-filter "git rm -rf --cached --ignore-unmatch path_to_file" HEAD
现在我在运行命令的分支上看到不同的 SHA 提交,我很好,因为存储库相当新,目前只有我使用它。但是,当我检查主分支和另一个开发分支时,我看到同一提交的 SHA 是不同的。当我合并到 dev 或 master(我还没有这样做(时,它不会失败吗?如何纠正此问题?
执行的一系列 git 命令:
git checkout -b move_branch master
add files from location1 commit
add files from location2 commit
add files from location3 commit
merge the master branch of an older repo which was added as a remote introducing some files including the big file commit
git filter-branch -f --index-filter "git rm -rf --cached --ignore-unmatch path_to_file" HEAD
add files from location5 commit
add files from location6 commit
A--B--C master
X--Y--Z--A--B--C--D--E move_branch (Z is the commit with big file)
X--Y--I--J--K--L--M--N move_branch (after filter-branch)
将分支合并到主分支不会失败。它也不会摆脱大文件。您实际上需要在主分支上运行此命令并强制推送此更改。由于这会重写存储库的历史记录,因此您需要先与您的团队进行沟通和计划。这是一种破坏性行为。
如果您独自处理此存储库:
这是一个简单的案例。只需在主服务器上对新提交进行硬重置即可。
git checkout -b fix_commits master
git filter-branch -f --index-filter "git rm -rf --cached --ignore-unmatch path_to_file" HEAD
git checkout master
git reset --hard fix_commits
# Push master if you need to
git push origin HEAD --force
如果多人在此存储库上工作
您最好的做法是:
从当前主分支创建一个新分支,并推送它。
git checkout -b master_before_file_purge git push origin -u HEAD
创建一个新分支来清除大文件,并重写其历史记录。推送此分支。
git checkout -b purge_large_files master git filter-branch -f --index-filter "git rm -rf --cached --ignore-unmatch path_to_file" HEAD git push origin -u HEAD
单独与每个队友合作,将他们的私有树重新定位到
purge_large_files
与团队合作,将基于 master 的共享分支重定基址到
purge_large_files
(您可能需要在这些分支上git push origin HEAD --force
(在主节点上硬重置为
purge_large_files
:git checkout master git reset --hard purge_large_files git push origin HEAD --force
与队友合作,确保他们可以毫无困难地拉动大师。
时间流逝后,删除"之前"分支:
git checkout master_before_file_purge git push origin --delete master_before_file_purge
您和您的队友需要在本地运行git gc
,以便在这些孤立的提交对象再次从源拉取后清除它们。