Git interactive-rebase через несколько веток
У меня есть git-репозиторий, в котором есть исходный файл, содержащий некоторое конфиденциальное содержимое, которое я хочу удалить (я не хочу удалять файл, просто измените его содержимое). Фиксация была довольно ранней в разработке проекта (когда у нас была только одна ветвь), но теперь находит себя в других ветвях.
Есть ли какая-нибудь мерзавца, которую я могу запустить, чтобы очистить ее во всех ветках? Интерактивная перебазировка работает только одна голова за раз.
Я нашел эту команду в github:
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch DotNet/src/ExternalLibs/GemBox/' \
--prune-empty --tag-name-filter cat -- --all
но это работает только для удалений, а не изменений.
A-B-C-**STUPID**-D-E-F
\
\-G-H-I
\-J-K
1 ответ
Если предположить, что измененное содержимое также не является конфиденциальным, то это может сработать: извлеките новую ветвь при коммите, который вы хотите изменить, измените файл, а затем используйте неинтерактивную перебазировку, которая сохраняет слияния всего после ранее не измененного совершить возврат на новый исправленный коммит:
# Checkout a branch "fix" at the commit STUPID
git checkout -b fix STUPID
# Make your file changes...
# Amend STUPID
git add .
git commit --amend -m "REDACTED MWA-HA-HA!"
# Do the BIGGEST rebase that you'll probably ever do in your entire life!
git rebase --preserve-merges --onto fix STUPID master
# or `-p` for short
git rebase -p --onto fix STUPID master
# Verify that the only difference between master and master@{1}
# is the amended content:
git diff master@{1} master
Как только вы убедились, что единственная разница между master
до и после того, как ребаз является измененным контентом, вы, вероятно, захотите очистить свои локальные и удаленные репозитории от старых коммитов, выполнив срок действия вашего reflog и запустив git gc
:
git reflog expire --expire=now --all
git gc --prune=now
Вы можете прочитать о любых других шагах по очистке, которые вам, возможно, понадобится сделать в следующем:
- Удалите конфиденциальные файлы и их коммиты из истории Git.
- GitHub: удаление конфиденциальных данных.
Кстати, сначала протестируйте ребаз на другом локальном клоне, прежде чем пробовать это на единственной копии вашего репо, которая у вас есть... на случай, если что-то пойдет не так.
О да, я почти забыл, если ваша поправка в STUPID
вызывает конфликты с коммитами, которые перебазируются поверх него, вам нужно будет исправить эти конфликты во время перебазирования.
Это 1337 гитфу принесло вам любезность Cupcake: выполнение операций на открытом сердце на репозиториях git с 2012 года;)