2016-01-07 81 views
13

我有一个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> 

我犹豫,尝试他们不知道肯定什么,他们会做,如果还是他们会工作。

+0

我从来没有使用它,它可能与您的情况没有任何关系,但如果您只是想摆脱不应该提交的敏感数据,那么[BFG](https) ://rtyley.github.io/bfg-repo-cleaner/)。 – DaveyDaveDave

+0

[删除本地和远程的Git分支]可能的副本(http://stackoverflow.com/questions/2003505/delete-a-git-branch-both-locally-and-remotely) –

+1

如果你只是想删除本地和远程分支,请参阅@codeWizard答案(http://stackoverflow.com/a/34657278/2531279)。 如果你想摆脱在这个分支上完成的提交,它会更复杂,而且确实需要使用'git filter-branch'。 – Frodon

回答

10

假设你想要核武器evilbranch

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

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

现在将其全部删除。你可以使用git命令,或者直接进入.git/refs

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

确保你没有分开的头。再次

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

,这应该在每台计算机上完成:

现在我们可以杀死所有的提交,因此,所有的代码,也就是不再可引用(从this GitHub的链接)。

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

注:666bad是后不管它来自何方evilbranch拆分第一次提交,即第一次提交,这只是evilbranch

+0

我如何使用它从github等远程控制中删除历史记录,我没有shell? – drs

+0

@drs通过在线界面删除标签和分支。当人们克隆时GitHub可能不会泄露任何提交(因为那是他们的链接),我怀疑GitHub是否有任何阴谋反对你。 – PyRulez

+0

您也可以使用[this](https://git-scm.com/book/en/v2/Git-Branching-Remote-Branches#Deleting-Remote-Branches)和[this](https:// nathanhoad。净/如何删除一个远程git标签),如果你不想使用在线界面。 – PyRulez

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上和你的分支上有任何引入请求,你必须联系GitHub的支持,并要求他们修剪你的引入请求。您还应该联系他们以删除缓存的视图。

相关问题