Статьи

Я бросил большой двоичный объект в Git … И что теперь?

Или как мне удалить файл из Git, включая историю? Это стало результатом обсуждения с некоторыми Рейнджерами ALM (фактически название было от самого Вилли-Питера !), И я подумал, что это слишком хорошо, чтобы не делиться. Кроме того, я добавил другую информацию, которую узнал с тех пор!

Прежде чем ты начнешь

Сделайте копию своего репозитория git перед началом! Мы будем связываться с вашим репо, поэтому, если у вас есть резервная копия и что-то пойдет не так, вы можете просто откатиться.

Revert

Если вы когда-либо допустили ошибку на компьютере, вы узнаете об этом в тот момент, когда вы отпустите кнопку ввода. Так что вы можете просто отменить этот последний коммит быстро и использовать команду revert в git, которая, кажется, удаляет его, но проблема в том, что он остается в истории. Так что это означает, что каждый должен получить его, когда клон или вытащить репо.

изменить

Если при последнем коммите был добавлен поврежденный файл, а вы НЕ выдвинули репо, существует простой процесс для его решения. Сначала удалите файл. Затем запустите другой коммит с ключами —a и —amend. 

  • —a говорит git автоматически ставить все измененные и удалять файлы.
  • —amend говорит git переписать последний коммит.
  • если этот файл был единственным, тогда вам может понадобиться добавить ключ —allow-empty, чтобы сказать git принять коммит, в котором ничего нет.

Например, если я хочу удалить файл password.txt.

del password.txt
git commit --a --amend

Rebase

Что делать, если это не последний коммит, а несколько назад. Еще раз, если вы не нажали на свое хранилище, можно было бы переписать историю (вы можете захотеть взглянуть на эту ссылку, она подробно описывает, что означает история переписывания). Первый шаг — запустить ребаз и в редакторе перейти к коммиту с проблемой и изменить его от выбора до редактирования, например:

git rebase -i origin/master 

На картинке выше я собираюсь удалить файл, добавленный в commit 47f73e6

После этого вы вернетесь обратно в командную строку и сможете выполнить коммиты, которые вы настроили для редактирования. Вы можете внести изменения (либо отредактировать файл, либо удалить его), а затем использовать те же изменения, что и раньше. Как только вы закончите, вы продвигаете перебазирование вперед, выполнив rebase —continue.

Например:

del password.txt
git commit --a --amend
git rebase --continue

Фильтр-Branch

Что делать, если вы нажали? Или, может быть, вам нужно что-то еще? В Git есть решение для этого, называемое filter-branch, которое мне до этого было совершенно неизвестно. Фильтр-ветвь не только полезен для удаления файлов, но вы также можете изменить детали ряда коммитов (например: обновление вашей электронной почты, связанной с вашими коммитами).

Позволяет избавиться от файла, например password.txt

git filter-branch --tree-filter "rm -f password.txt" HEAD

Примечание. В Windows вы будете использовать двойные кавычки («), как указано выше, но в Linux это будет одинарная кавычка (‘). После этого вам нужно нажать на git, но для этого вам понадобятся ключи —force и —all.

git push --force --all

Ваша следующая проблема заключается в том, что у всех членов вашей команды все еще есть файл (если он уже вытащил), поэтому им нужно его очистить. То, как они это делают, это запустить rebase, но с помощью переключателя на этот раз. Например:

git rebase --onto origin/master master

Те участники, которые не вытянули с тех пор, как этот файл попал в репо, могут работать как обычно и не должны беспокоиться об этом.

BFG

Существует также отдельный инструмент под названием BFG Repo Cleaner . Для этого есть хороший набор документации, и это невероятно быстро! Одна хорошая вещь, вы можете сказать, удалить все файлы выше определенного размера или х число самых больших файлов.

GC

После того как вы все это сделаете, запустите сборку мусора с помощью команды gc , которая может вернуть дисковое пространство из потерянных файлов. Для этого выполните:

git gc – --auto

Это оно! Вы когда-нибудь испортили файл (я зафиксировал пароль Azure один раз в файле!)? Поделитесь, что случилось и как вы это исправили!