4

У меня есть GIT репозиторий, который имеет исходный файл, содержащий некоторые конфиденциальные данные, которые я хочу, чтобы удалить (Я не хочу, чтобы удалить файл, просто изменить его содержание). Конец был довольно ранним в разработке проекта (когда у нас была только одна ветка), но теперь находит свое «я» в n других ветвях.Git интерактивное-пересчитать динамические через несколько ветвей

Есть ли какой-либо git-fu, который я могу запустить, чтобы очистить его во всех ветках? Интерактивная ребаза работает только один голов за раз.

Я нашел this командование на 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 
+0

ли измененное содержание также не "чувствительны"? –

+0

Код содержит файл кода для тестового проекта с лицензионным ключом, который мы хотим заменить прокладкой. Мы можем исправить тесты с помощью новой фиксации –

ответ

2

Предполагая, что измененное содержание также не является чувствительным, то это мощи работы: проверка нового филиала коммит, который вы хотите изменить, изменить файл, а затем использовать неинтерактивную Rebase что сохраняет слияния всех после того, как ранее не-поправка фиксации обратно на новом измененную фиксацию:

# 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 [email protected]{1} 
# is the amended content: 
git diff [email protected]{1} master 

после того, как вы убедились, что единственное различием между master до и после перебазирования является измененным содержанием, вы будете возможно, хочу чтобы очистить ваши локальные и удаленные репозитории старых фиксаций Истечение ваш reflog и работает git gc:

git reflog expire --expire=now --all 
git gc --prune=now 

Вы можете прочитать любые другие шаги очистки, которые могут понадобиться, чтобы сделать в следующем:

  1. Remove sensitive files and their commits from Git history.
  2. GitHub: Remove sensitive data.

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

О, да, я почти забыл, если ваша поправка в STUPID вызывает конфликты с коммитами, которые перестраиваются поверх нее, вам нужно исправить эти конфликты во время переустановки.

Это 1337 ГИТ-фу принес к вам любезноКекс: Performing операции на открытом сердце по GIT сделкам РЕПО с 2012 года;)

+0

Спасибо, кекс. То, что я сделал в первую очередь (до публикации этого), было: исправить файл, зафиксировать, «git rebase -i HEAD ~ 250», переместить фиксацию fixup сразу после STUPID и сквош. Это работало для первой ветви, но затем дало мне всевозможные боли для (правда, немногих) других.Я буду пытаться исправить завтра после того, как плачу себе спать :) –

Смежные вопросы