2009-08-20 2 views
2

Мне нужно переписать историю моего репозитория, потому что он содержит некоторые учетные данные. Как я должен изменить корень фиксации Я следовал инструкциям из Git Faq:Git, редактировать root commit для всех ветвей

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

# tag the old root 
git tag root `git rev-list HEAD | tail -1` 
git checkout -b new-root root 
# edit... 
git commit --amend 

# check out the previous branch 
git checkout @{-1} 
# replace old root with amended version 
git rebase --onto new-root root 

# cleanup 
git branch -d new-root 
git tag -d root 

Моя проблема заключается в том, что, хотя у меня есть две ветви и несколько тегов уже в хранилище, и я хотел бы, что моя история переписана, чтобы обратиться к тем, тоже. Репо еще не является публичным, так что это не проблема. Я уже спрашивал similar question, но в этом случае команда git rebase не использовалась. Вот базовый график моего репо:

+ master branch 
| 
| + topic branch 
| | 
| | 
+---+ 
| 
| 
| 
+ TAG 
| 
+ Initial commit, the commit I'd like to amend for all branches 

Возможно ли это?

+0

Возможно, связано: [Изменить/изменить/изменить/изменить первый/корневой/начальный коммит в Git?] (Http://stackoverflow.com/q/2119480/456814). – 2014-05-15 08:47:24

ответ

6

"git filter-branch" вместо git-rebase.

Если вы действительно чувствуете, что rebase будет лучше, с современным git вы можете использовать --root вариант git-rebase. Или вставьте корневую команду root, а затем замените ее сверху, если у вас есть более старый git, у которого нет этой опции.

+0

Спасибо Якуб. Но я не совсем уверен, как «фильтр-ветвь» поможет мне. Мне нужно отредактировать код почти в 10 файлах, так что я притворяюсь, что первый коммит не имеет учетных данных. Я не знаю, как это возможно, потому что для этих файлов нет стандартного формата. Это всего лишь код. Я думаю, что можно было бы использовать '--tree-filter', но, похоже, сложно усложнять анализ кода. –

+2

Если это так, самым простым решением было бы создать новую пустую ветку ('git symbolic-ref HEAD refs/heads/new && rm -f .git/index'), и либо root, отредактируйте его, используя 'git commit -amend', затем перезагрузите остальные или используйте' git rebase -interactive -root -onto new master'. НТН. –

+0

Спасибо, я попробую их обоих, хотя второй вариант кажется проще. Очень ценится. –

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