Я случайно передал некоторую конфиденциальную информацию в публичный репозиторий git (yikes!). Есть ли способ, которым я могу навсегда удалить всю историю между определенным диапазоном дат? Должен ли я просто удалить весь репо и начать все заново?
1 ответ
Стандартный способ сделать это с помощью 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.