2010-04-22 4 views
14

Я читал об использовании мерзавца как Svn клиента здесь:Требуется ли git svn rebase перед git svn dcommit?

http://learn.github.com/p/git-svn.html

Эта страница наводит на мысль, что вы мерзавец SVN перебазироваться до того мерзавец Svn dcommit, что делает прекрасный смысл; это похоже на выполнение svn update перед выполнением svn commit. Тогда я начал искать в документации по мерзавец Svn dcommit (мне было интересно, что «d» о):

http://git-scm.com/docs/git-svn

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

Commit каждый дифференциал из указанной головки непосредственно в хранилище SVN, , а затем перебазироваться или сброс (в зависимости от того, существует или нет это различия между SVN и головами).

Это меня смущает, потому что если вы сделаете так, как написано на первой странице, никаких изменений для спуска с svn после завершения первой части dcommit не произойдет.

Я также смущен тем, что говорит об перезагрузке; не сбрасывает git для удаления изменений из промежуточной области?

Зачем нужно переустанавливать или перезаписывать (первая часть) dcommit?

ответ

19

Отказ от ответственности: Я вообще делать тенденцию бежать git svn rebase, прежде чем делать git svn dcommit. Обычно я сохраняю свои изменения в другой ветке git, так что у rebase нет никаких шансов на неудачу. Я использую git rebase master в моей ветке темы, чтобы обновить ее. Затем я переключаюсь на ветку master и использую git merge, чтобы включить изменения из моей ветви темы в master (это перемотка вперед из-за переустановки).

Мои объяснения объясняют, почему это не механически необходимо, но я согласен с тем, что это хорошая идея. Ваши изменения могут не вызывать конфликтов с точки зрения различий и слияния, но если вы не используете свои коды, не получая последних изменений от svn и рассматривая их эффекты, вы можете сделать код svn, который на самом деле не подходит.


Вы не имеют к git svn rebase перед запуском git svn dcommit. Если изменения, которые вы хотите выполнить dcommit, находятся в файлах, которые не изменились в svn с момента внесения последних изменений, git-svn не будет отображать конфликт. Таким образом, вы можете совершать изменения в репозитории svn, используя репозиторий git, который не имеет всех последних изменений из svn.

Предположим, я запустил репозиторий svn, который содержит два файла: foo.txt и bar.txt. До сих пор у них только одна ревизия. Я делаю git svn clone, чтобы начать отслеживание репозитория svn с помощью git.

 
$ git log --oneline --decorate 
7e72290 (git-svn, master) Initial commit. 

Вы вносите изменения в foo.txt и git commit их на ваш master отрасли, поэтому она движется вперед git-svn.

 
$ git log --oneline --decorate 
aa70eca (master) Added a line to foo. 
7e72290 (git-svn) Initial commit. 

То, что вы не понимали, что ваш друг уже совершил изменения в bar.txt как пересмотр SVN 2.

Теперь при запуске git svn dcommit из master, мерзавца будет искать ревизии между тем, где вы находитесь и где git-svn снят. В этом случае у вас есть только один: aa70eca. git пытается отправить этот diff в ваш репозиторий svn.

 
$ git svn dcommit 
Committing to [svn repo address] ... 
     M  foo.txt 
Committed r3 
     M  bar.txt 
r2 = 12b95b96e11f782f31b07a78756660cb82437ca2 (refs/remotes/git-svn) 
     M  foo.txt 
r3 = d4a7b84e0383f3af5fb0db439169c9f1b8af1152 (refs/remotes/git-svn) 
W: aa70ecae4121854ac3754fb882a483b67d706a4a and refs/remotes/git-svn differ, using rebase: 
:100644 100644 5771152459bfaa7cc62caa3b6b4d24e52ab8e447 dbfaecb10330d0509e092f1891a4a7e673802413 M  bar.txt 
First, rewinding head to replay your work on top of it... 
Nothing to do. 

$ git log --oneline --decorate 
d4a7b84 (git-svn, master) Added a line to foo. 
12b95b9 Added to bar. 
7e72290 Initial commit. 

Вы можете видеть, что коммит удался, как пересмотр SVN 3. Когда ГИТ-SVN затем синхронизирована ваша местная история СВЕН с хранилищем SVN, он принес все новые коммиты включая изменение только что представленное svn. Вы заметите, что это изменение (d4a7b84) имеет другой SHA-хэш из того, что вы использовали в git (aa70eca). Это связано с множеством вещей: разные временные метки фиксации, потенциально разные имена авторов, git-svn-id в журнале фиксации, полученной из svn, и другой родословной — извлеченный svn r3 имеет r2 в качестве родителя, но ваша git-фиксация произошла от r1.

В этом случае произошел разрыв, обнаруженный после извлечения текущей текущей головки git (master) и SVN, поскольку содержимое в r2 изменилось на foo.txt. В результате, git-svn будет rebase.

Если я делаю изменения и никакой другой СВН коммитов произошло в то же время (или я был запущен git svn rebase, чтобы держать в курсе), то git-svn не найти различий между головой и СВН, поэтому он может просто сброс:

 
$ git svn dcommit 
Committing to [svn repo address] ... 
     M  foo.txt 
Committed r4 
     M  foo.txt 
r4 = 533f7337999778628cf39fcd9155d085eb1c2b89 (refs/remotes/git-svn) 
No changes between current HEAD and refs/remotes/git-svn 
Resetting to the latest refs/remotes/git-svn 
+0

re git svn rebase не требуется перед тем, как «совершить»: совершая, вы имеете в виду git svn dcommit right? Отдельно, вы не имеете в виду, Я также смущен многими вещами во втором абзаце. 1) Есть ли смысл реимпорта? 2) Вы утверждаете, что вы это сделали из содержимого сообщений о фиксации? – allyourcode

+0

3) Что вы подразумеваете под «git-svn» можно сбросить содержимое, полученное из-svn »? Я думал, что сброс git используется для удаления изменений из промежуточной области; в то время как вы, кажется, говорите, что сброс изменений, на которые указывает текущая ветка. 4) Как любые изменения не могут быть перенесены в svn после выполнения git svn dcommit? Разве эта команда не нажимает все изменения с моего локального репозитория git на удаленное svn-репо? – allyourcode

+0

Я переписал большую часть своего ответа, чтобы включить примеры, которые должны иллюстрировать, почему выборка + перезагрузка после dcommit имеет решающее значение. Надеюсь, он должен обратиться к пунктам 1 и 2. – MikeSep

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