我读过,通常情况下,删除的分支可以复活。
我正在寻找一种完全消灭分支的方法。
其中一位开发人员在该分支机构内部存放了2Gb的资产,这实际上是内容,不应该在回购中。
注意:我还没有将它合并为主人!
答案 0 :(得分:2)
您应该能够通过使用git filter-branch
来做到这一点。例如,假设要删除的文件位于名为content
的目录中:
git filter-branch --tree-filter 'rm -rf content' --prune-empty
这将迭代分支中的所有提交,从发生的任何提交中删除错误的内容。
答案 1 :(得分:2)
我想补充一点,我个人更喜欢filter-branch
方法,因为这并不涉及历史的丢失。如果filter-branch
似乎难以使用,您可以查看更简单的BFG Repo-cleaner。
尽管如此,我还是会为完整性提供一种替代方案。
既然您在评论中说过,您可以选择丢弃旧合并并创建一个新合并,我建议您创建一个壁球合并。
假设您的存储库具有与此类似的历史记录。
* The merge commit [master]
|\
| * feature commit [feature]
| |
| * feature commit (the evil one)
. .
. . (some more commits)
. .
|/
*
首先,我们将撤消合并。
git checkout master
git reset --hard HEAD^
现在我们再次合并功能,但这次使用--squash
选项。执行此操作时,git不会创建通常的合并提交(说多个父项),但它将应用功能分支中的所有更改,并使您的工作树处于状态,就像& #34;通常"合并发生(take a look at the documentation)。
git merge --squash feature
现在您可以解决可能的冲突,然后只提交合并的更改(git commit
)。但是,请注意,这样的合并显然没有引用合并分支的历史记录(在本例中为 feature );您应该在提交消息中包含该信息。
假设除了实际分支之外没有其他对 feature 的引用 - 您现在可以继续删除分支,然后是garbage collection。
git branch -D feature
git gc
您必须意识到git gc
将仅删除 功能分支的历史记录和 blob ,如果您有<强>没有其他参考指向他们。你必须确保是这种情况。
git gc
不仅会删除功能分支的历史记录,还会删除每个悬空对象。为了更好地理解我建议阅读课程书的Git Internals - Maintenance and Data Recovery章节的含义和后果。