Git: изменить одну строку в файле для полной истории
Когда я запустил репозиторий git, я совершил несколько файлов в качестве первоначальной фиксации. Теперь многие коммиты позже, я заметил, что я включил в эти файлы строку с информацией, которую я не хочу публиковать (в отличие от остальной части кода). Поэтому я хочу удалить/изменить эту строку и сохранить остальные кода.
Поиск вокруг я нашел это решение: вставьте пустую фиксацию в качестве первоначальной фиксации (описанной здесь: Вставьте фиксацию перед фиксацией корня в Git?), сделайте переформатировать его, а затем отредактировать старую первую фиксацию с помощью поправки. К сожалению, во время rebase возникают многие конфликты с жестким слиянием (как описано здесь: git: разрешение конфликтов, вызванных rebase).
Есть ли другой способ решить мою проблему или нужно переустанавливать и редактировать все конфликты вручную?
Заранее спасибо:)
TIBO
Ответы
Ответ 1
Здесь команда, которая удалит строку нарушения из истории файлов во всех ваших ветвях:
git filter-branch --tree-filter 'sed -i "/sensitive information/ d" filename' -- --all
Это проверяет каждую ревизию, запускает на ней команду sed
, а затем возвращает эту ревизию.
Команда sed
в этом случае соответствует строкам, содержащим шаблон sensitive information
в файле с именем filename
, и удаляет эти строки.
Примечание: хорошо, если у вас есть резервная копия, и сначала попробуйте sed
script, чтобы убедиться, что он делает то, что вы хотите, потому что для длительной истории может потребоваться довольно много времени.
Ответ 2
Я сделал эту команду, которая не выдает ошибку, когда файл не существует:
filename=./path/to/your/filename
filter=your_regex_here
git filter-branch --tree-filter 'test -f $filename && sed -i.bak "/$filter/d" $filename || echo "skipping file"' -- --all
Ответ 3
Вы можете посмотреть git filter-branch
Примеры в ссылке должны помочь вам: http://git-scm.com/docs/git-filter-branch