如何在本地和远程删除分支及其所有历史记录?

时间:2016-01-07 13:59:45

标签: git git-filter-branch

我有一个git分支,我需要核对的所有痕迹。我想我需要像

这样的东西
git filter-branch --index-filter 'git -D <branch>' --tag-name-filter cat -- --all

或者

git filter-branch --index-filter 'git rm --cached *' --tag-name-filter cat -- <branch>

然后我会

git push -f origin :<branch>

我不愿意在不确定他们会做什么或他们是否会工作的情况下尝试这些做法。

2 个答案:

答案 0 :(得分:10)

让我们说你想要核对evilbranch

您说要删除所有分支的历史记录。这在技术上包括初始提交,这可能是您想要的更多提交。首先,确定您认为哪个提交是该分支的第一次提交。让我们说666bad。现在我们需要找到它的所有引用。运行

git branch -a --contains 666bad
git tag --contains 666bad

现在全部删除它们。您可以使用git命令,也可以直接进入.git/refs

在可能包含该文件的每台计算机上执行此操作。

确保你没有处于分离状态。

现在我们可以杀死所有提交,因此所有代码都不再可引用(来自this gitHub链接):

git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now

同样,这应该在每台计算机上完成。

最后,在每台计算机上使用this

注意:666badevilbranch之后的第一个提交,无论它来自何处,即第一次提交仅为evilbranch

答案 1 :(得分:0)

调查受影响的分支和标记

找到您想要核实的分支的第一次提交,可能使用git log --all --decorate --graph --oneline或使用git reflog。我们先说第一次提交是666bad

使用PyRulez提到的提示来帮助查找可能被此分支污染的任何标签或分支。

git branch -a --contains 666bad
git tag --contains 666bad

如果有任何标签与分支相关联,请在本地和远程删除它们。

git tag -d <tag name 1> <tag name 2> ...               # remove tags locally
git push --delete origin <tag name 1> <tag name 2> ... # remove tags remotely

清理本地和远程分支

签出要删除的分支,并使用git filter-branch将分支上的所有提交重置为分支的父级首次提交:

git checkout evilbranch
git filter-branch --force --index-filter `git reset --hard 666bad^' \
                  --prune-empty 666bad..HEAD

这将删除提交,因为它们是空的。

强制将结果推送到您的原点

git push origin --force

清理您的reflog并修剪悬空提交

git reflog expire --expire=now --all
git gc --prune=now

清理团队成员分支

确保已签出分支的其他人删除了他们计算机上的标签和分支,然后他们的reflog和垃圾收集过期。

git tag -d <tag name 1> <tag name 2> ...
git branch -D evilbranch
git checkout master
git reflog expire --expire=now
git gc --prune=now

最后一点

如果您的来源是GitHub并且您的分支机构上有任何Pull请求,您必须联系GitHub支持并请求他们修剪您的Pull请求。您还应该与他们联系以删除缓存的视图。