2012-04-19 3 views
16

Короткий вопрос: что такое git-svn-эквивалент svn up -r r1130, чтобы обновить только до нумерованного commit (с номером svn)?Могу ли я использовать svn rebase для некоторой версии svn? (Подобно svn up -r ...)

Я использую git-svn, поэтому я могу использовать git и управлять (многими) локальными ветвями репозитория svn моей команды. У меня есть версия программного обеспечения, которое я взламываю для работы с определенной аппаратной настройкой. С тех пор как я работал с ним, svn repo продвигался вперед за стабильный, хороший момент для этой работы. Я хочу обновить локальную ветвь до нумерованной ревизии, которая представляет собой стабильную фиксацию. Я мог бы сделать это в svn с svn up -r r1130, но я предпочитаю git.

Я продолжаю забывать, как я это делал в прошлом, и обнаружил, что искал SO и страницы помощи, пытаясь найти лучший способ. Возможно, есть другое слово Q & A, которого я не хватает?

Достаточно просто проверить устаревшую версию на чистом дереве, но когда я переношу на вершину дерева, «перематывая голову, чтобы воспроизвести вашу работу поверх нее ...», часть, которая Я, как правило, люблю, что я буду идти в точку на дереве, прежде чем мои изменения будут добавлены!

На данный момент я собираюсь git svn rebase, а затем в интерактивном режиме переустанавливать коммиты, которые я не хочу, но у меня возникают проблемы с верой в то, что это лучший или даже хороший способ сделать это.

ответ

18

Я предпочитаю rebase, потому что git-svn придется поменять ваши изменения в любом случае до dcommit. Попробуйте вместо этого:

git checkout `git svn find-rev r1241` # Go to the svn version of interest 
git checkout -b master_r1241   # Create a new brach matching it 
git checkout hwTesting     # Merge previously created changes 
git rebase master_r1241    # rebase on top of not quite up-to-date master branch 

Вы могли бы сделать это за один шаг также: (всегда можно вернуться с помощью reflog или rebase --abort, если дела идут ужасно неправильно).

git checkout hwTesting     # Checkout feature branch 
git rebase `git svn find-rev r1241` # rebase on top of not quite up-to-date master branch 
+0

У меня наконец появился шанс попробовать это, и одношаговая версия этого именно то, что я искал. Благодаря! – sage

1

Кажется, что нет способа сделать это за один шаг. Однако вы можете легко найти соответствующий идентификатор фиксации git для данного номера версии svn. Попробуйте следующее:

git svn find-rev rN 

где N - номер редакции, который вы хотите. После этого используйте git checkout, чтобы проверить этот конкретный момент в истории.

+0

Это полезная команда, которая, как правило, полезно, но если я нахожусь в отрасли, в которой новые коммиты и I 'мерзавец Svn rebase' этой отрасли, то она повторит мои новые коммиты на вершине SVN Commit обсуждаемый. Ваша команда проверит * unmodified * svn commit, т. Е. Без моих изменений, совершенных сверху. Возможно, я мог бы это сделать, а затем создать новую ветку в этот момент и, наконец, объединить эту новую ветку в мою ветку функций? – sage

+0

Хороший вопрос ... Я думаю, что обычно я предпочитаю git svn rebase только для отслеживания ветвей ...таким образом, мои ветви функций не затронуты, пока они не будут готовы к интеграции с основной линией. Я взял ваш вопрос, чтобы спросить, как обновить, и затем перейдите к конкретной ревизии в новых коммитах. –

0

Я оставлю это для справки, так как принятый ответ упоминает об этом. Используйте вариант однофазной переустановки, хотя ...


Вот что я делаю сейчас. На этот раз я обновляю R1130 (упомянуто в вопросе) в r1241:

git checkout `git svn find-rev r1241` # Go to the svn version of interest 
git checkout -b hwTesting_r1241  # Create a new brach matching it 
git merge hwTesting_r1130    # Merge previously created changes 

В основном, это дает мне то, что я хочу, но это порождает другую ветку, каждый раз, когда я обновляю. Кажется, должен быть какой-то способ сказать git объединить только коммиты на master до и включая тот, который возвращается git svn find-rev r1241.