2016-01-07 3 views
13

У меня есть ветка git Мне нужно nuke все следы. Я думаю, что нужно что-то вродеКак удалить ветку и всю ее историю локально и удаленно?

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

Предположим, вы хотите использовать Nuke evilbranch.

Вы говорите, что хотите удалить всю историю филиала. Это технически включает начальную фиксацию, которая, вероятно, больше совершает то, что вы хотите. Итак, сначала определите, какое обязательство вы считаете первым фиксатором этой ветви. Скажем, это 666bad. Теперь нам нужно найти все ссылки на него. Пробег

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

Теперь удалите их все. Вы можете использовать команды git или просто перейти в .git/refs.

Сделайте это на каждом компьютере, у которого может быть файл.

Удостоверьтесь, что вы не в отдельной голове.

Теперь мы можем убить все фиксации, и поэтому весь код, который больше не Referenceable (от 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 на каждом компьютере.

Примечание: 666bad является первым совершить послеevilbranch отделились от туда, куда он пришел, то есть, первый коммит, который только evilbranch.

+0

Как я могу использовать это, чтобы удалить историю из пультов, таких как github, что у меня нет оболочки? – 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.net/how-to-delete-a-remote-git-tag), если вы не хотите использовать онлайн-интерфейс. – 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 

Очистка локальных и удаленных филиалов

Checkout ветвь вы хотите удалить и использовать git filter-branch для сброса всех фиксаций на ветви к родителю ветви сначала совершить:

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

Это удалит коммиты по мере их поступления, потому что они пустые.

Force-раздвинуть результаты вашего происхождения

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 запросы. Вы также должны связаться с ними, чтобы удалить кешированные представления.

Смежные вопросы