1

Я случайно передал некоторую конфиденциальную информацию в публичный репозиторий git (yikes!). Есть ли способ, которым я могу навсегда удалить всю историю между определенным диапазоном дат? Должен ли я просто удалить весь репо и начать все заново?

1 ответ1

4

Стандартный способ сделать это с помощью git-filter-branch. Это позволяет вам пройтись по истории коммитов и переписать каждый из них в некотором роде. В вашем случае, допустим, вы случайно зафиксировали passwords.txt и должны удалить его из своей истории.

Команда, которую вы запустите, может выглядеть примерно так:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch passwords.txt' HEAD

Кусочек за кусочком:

  • git filter-branch : переписать историю.

  • --index-filter : для каждого коммита мы хотим каким-то образом изменить индекс, а затем повторно его зафиксировать.

  • 'git rm --cached --ignore-unmatch passwords.txt' : для каждого коммита измените индекс, выполнив эту команду git-rm . Это удалит любой файл с именем passwords.txt из индекса.

  • HEAD : переписать историю ветки, которая в данный момент проверена.

Когда вы закончите, вы получите новый коммит с идентичной историей, за исключением отсутствия passwords.txt . Поскольку вы переписали историю, вам нужно будет предупредить всех, кто поделится с вами репозиторием, что они должны восстановить вашу исходную версию .

Например, если ваша история выглядела так, а коммиты BC были испорчены:

A ---- B ---- C ---- D ---- E

Когда вы закончите, ваша история будет выглядеть так:

A
 \
  B' ---- C' ---- D' ---- E' 

Обратите внимание, что D и E были переписаны для D 'и E'. Они могут указывать на одни и те же деревья, но поскольку история изменилась, у них будут новые идентификаторы коммитов, и они будут считаться новыми коммитами, насколько это касается Git.

Более подробную информацию об использовании git-filter-branch можно найти в разделе "История переписывания" книги Pro Git.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .