Подтвердить что ты не робот

Как удалить ветку и всю ее историю локально и удаленно?

У меня есть ветвь 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>

Я не решаюсь попробовать их, не зная наверняка, что они будут делать, или если они будут работать.

4b9b3361

Ответ 1

Скажем, вы хотите nuke evilbranch.

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

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

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

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

Убедитесь, что вы не отсоединились.

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

Ответ 2

Исследуйте затронутые ветки и теги

Найдите первую фиксацию для ветки, которую вы хотите использовать, возможно, используя 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 до reset все фиксации на ветке родительскому элементу первой транзакции:

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