Отредактируйте файл во всех коммитах в git

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

История репозитория очень проста, так как я единственный разработчик, поэтому он имеет только 12 коммитов и один из коммитов отмечен.

Изменение в этом случае не повлияет ни на что из истории (diff останется прежним), поскольку пароль, который я хочу удалить, присутствует только с самого первого фиксации. Я хотел бы удалить эту строку, как если бы она не была там в любое время.

Есть ли какая-то команда для этого, или я должен восстановить историю только с начала с новой отправной точкой без пароля и применить отличия поверх этого?

Ответ 1

См. https://help.github.com/articles/remove-sensitive-data. файл будет присутствовать во всех коммитах, если вы его не удалили, поскольку все коммиты содержат состояние всего репо.

В основном, что вам нужно сделать, это запустить ветвь фильтра через все ваши коммиты, а затем принудительно надавить на репо. Команда деструктивна и изменит все коммиты, где файл присутствовал на репо, поэтому будьте осторожны.

Ответ 2

Спасибо, что это была именно команда, которую я искал и читал эту статью, и документацию о филиале фильтра я получил точно синтаксис, который я хотел использовать sed, чтобы удалить строку из файла.

git filter-branch --tree-filter "sed -i 's/\<password\>//g' ./path_to_file/filename" --prune-empty --tag-name-filter cat -- --all

где:

"password" → Строка, которая должна быть удалена

"./path_to_file/filename" → Является ли путь к файлу внутри репо, который необходимо изменить

запущенный в корне репо, сделал трюк как шарм.

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

Таким образом, принудительное нажатие репо на удаленный сервер (происхождение в большинстве случаев)

git push origin --all --force

И принудительное нажатие тегов на удаленный сервер

git push origin --tags --force

Ответ 3

Я бы сделал следующее:

git rebase --interactive

Измените команду pick перед первой фиксацией (фиксация с паролем) на edit и сохраните все остальные строки как есть. Сохраните файл и выйдите.

Затем удалите пароль из файла (и выполните любые другие необходимые изменения), затем:

git add name-of-file-with-password
git commit --amend
git rebase --continue