过滤器分支后同一提交的不同 SHA,当我合并到 dev 或 master 时,它不会失败吗?我该如何防止这种情况?



>我不小心将一个大文件添加到特定分支上的 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

如果多人在此存储库上工作

您最好的做法是:

  1. 从当前主分支创建一个新分支,并推送它。

    git checkout -b master_before_file_purge
    git push origin -u HEAD
    
  2. 创建一个新分支来清除大文件,并重写其历史记录。推送此分支。

    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
    
  3. 单独与每个队友合作,将他们的私有树重新定位到purge_large_files

  4. 与团队合作,将基于 master 的共享分支重定基址到purge_large_files(您可能需要在这些分支上git push origin HEAD --force(

  5. 在主节点上硬重置为purge_large_files

    git checkout master
    git reset --hard purge_large_files
    git push origin HEAD --force
    
  6. 与队友合作,确保他们可以毫无困难地拉动大师。

  7. 时间流逝后,删除"之前"分支:

    git checkout master_before_file_purge
    git push origin --delete master_before_file_purge
    

您和您的队友需要在本地运行git gc,以便在这些孤立的提交对象再次从源拉取后清除它们。

相关内容

  • 没有找到相关文章

最新更新