Ответ 1
Прежде всего, вы должны изменить пароль на FTP-сайте. Пароль уже опубликован; вы не можете гарантировать, что никто не клонировал репо, или он не был в текстовом виде в резервной копии, или что-то в этом роде. Если пароль вообще ценен, я бы счел его скомпрометированным.
Теперь, для вашего вопроса о том, как редактировать историю. Для этой цели предназначена команда git filter-branch
; он будет проходить через каждую фиксацию в истории вашего репозитория, применять команду для ее изменения, а затем создавать новую фиксацию.
В частности, вы хотите git filter-branch --tree-filter
. Это позволяет редактировать содержимое дерева (фактические файлы и каталоги) для каждой фиксации. Он будет запускать команду в каталоге, содержащем все дерево, ваша команда может редактировать файлы, добавлять новые файлы, удалять файлы, перемещать их и т.д. Git затем создаст новый объект фиксации со всеми теми же метаданными (сообщение фиксации, дата и т.д.) как предыдущее, но с деревом, измененным вашей командой, обработкой новых файлов как добавлением, отсутствием файлов как удаляет и т.д. (поэтому вашей команде не нужно делать git add
или git rm
, просто нужно изменить дерево).
Для ваших целей должно работать что-то вроде следующего: с соответствующим регулярным выражением и именем файла в зависимости от вашей конкретной ситуации:
git filter-branch --tree-filter "sed -i -e 's/SekrtPassWrd/REDACTED/' myscript.py" -- --all
Не забудьте сделать это с копией вашего репозитория, поэтому, если что-то пойдет не так, у вас все еще будет оригинал и вы можете начать заново. filter-branch
также сохранит ссылки на ваши исходные ветки, как original/refs/heads/master
и т.д., поэтому вы сможете восстановить, даже если вы забудете это сделать; при выполнении некоторых глобальных изменений в моей истории исходного кода, мне нравится, чтобы у меня было несколько резервных копий на случай, если что-то пойдет не так.
Чтобы объяснить, как это работает более подробно:
sed -i -e 's/SekrtPassWrd/REDACTED/' myscript.py
Это заменит SekrtPassWrd
в вашем файле myscript.py
на REDACTED
; параметр -i
для sed
сообщает ему, что он редактирует файл на месте, без файла резервной копии (поскольку эта резервная копия будет подхвачена Git как новый файл).
Если вам нужно сделать что-то более сложное, чем одна подстановка, вы можете написать script и просто вызвать это для своей команды; просто обязательно вызовите его с абсолютным именем пути, так как git filter-branch
вызовите свою команду из временного каталога.
git filter-branch --tree-filter <command> -- --all
Это сообщает git
запустить фильтр дерева, как описано выше, над каждой ветвью вашего репозитория. Часть -- --all
сообщает Git применить это ко всем ветвям; без него он будет редактировать историю текущей ветки, оставляя все остальные ветки неизменными (что, вероятно, не то, что вы хотите).
См. документацию по GitHub на Удаление чувствительных данных (как изначально указано MBO) для получения дополнительной информации о копировании информации, которая была перенесена в GitHub. Обратите внимание, что они повторяют мой совет по изменению пароля и дают несколько советов по работе с кэшированными копиями, которые все еще могут иметь GitHub.