是否可能完全删除一个Git分支?

6

我了解到通常情况下,已删除的分支可以被恢复。

我正在寻找一种彻底消除分支的方法。

其中一个开发者在该分支中放置了2GB的资产,这确实是内容,不应该在仓库中。

注意:我尚未将其合并到主分支!


3
我认为https://dev59.com/r18e5IYBdhLWcg3wssLG#25458504可以帮助你,你需要做类似的事情。 - Anshul Goyal
我需要处理特定文件的@mu無太复杂了,我需要更简单的东西,rm -rf branch。 - user796443
@salivan,你说你想要一个更简单的解决方案,但你可能没有这个选项。如果有问题的文件已经合并到另一个分支(在你的情况下是master),那么它们也在该分支中。你不能只删除其他分支并期望看到存储库大小缩小。 - Chris
你有“重做”合并的选项吗?是指放弃旧的合并��交并创建一个新的吗?如果是,我可能有一些想法。 - Sascha Wolf
@Zeeker 是的!我可以做到 :) 但我还没有将它合并到主分支。 - user796443
2个回答

4

您可以通过使用git filter-branch轻松实现此操作。例如,假设要删除的文件位于名为content的目录中:

git filter-branch --tree-filter 'rm -rf content' --prune-empty

这将遍历您的分支中的所有提交,在其中出现错误内容的提交中删除它。

4
我想补充一点,我个人更喜欢使用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不会创建一个通常的合并提交(有多个父级),而是将来自功能分支的所有更改应用,并将您的工作树保留在与“通常”合并发生的状态相同的状态中(请查看文档)。
git merge --squash feature

现在,您可以解决可能的冲突,然后简单地提交合并后的更改(git commit)。但是,请注意,这样的合并显然没有对合并分支(在本例中为feature)的历史记录进行参考;您应该在提交消息中包含该信息。
假设除了实际分支之外,没有其他对feature的引用,现在您可以继续删除该分支,然后进行垃圾回收
git branch -D feature
git gc

你必须意识到,git gc只会删除那些没有其他引用指向的功能分支的历史和blob。你需要确保这是正确的情况。

重要提示

git gc不仅会删除功能分支的历史记录,还会删除每个dangling object。为了更好地了解其影响和后果,建议阅读progit书籍中的Git Internals - Maintenance and Data Recovery章节。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接