Я читаю об использовании мерзавца как svn клиент здесь:
http://learn.github.com/p/git-svn.html
Та страница предлагает, чтобы Вы сделали мерзавца svn переоснова перед мерзавцем svn dcommit, который имеет смысл; это похоже на выполнение svn обновление прежде, чем сделать фиксацию svn. Затем я начал смотреть на документацию для мерзавца svn dcommit (я задавался вопросом, что 'd' о):
http://git-scm.com/docs/git-svn
Необходимо прокрутить немного вниз для наблюдения документации относительно dcommit, который говорит это:
Фиксируйте каждую разность от указанного главы непосредственно к репозиторию SVN, и затем повторно основывайте или сбросьте (в зависимости от того, существует ли разность между SVN и головой).
Это смущает меня, потому что, если Вы делаете, поскольку первая страница говорит, не будет никаких изменений в выпадающем от svn однажды первая часть концов dcommit.
Я также смущен частью, которая говорит о сбросе; разве мерзавец не сбрасывается для удаления изменений из района сосредоточения войск?
Почему переоснова или сброс следовали бы (первая часть) за dcommit?
Отказ от ответственности: Я обычно действительно обычно запускаю git svn rebase
перед выполнением git svn dcommit
. Обычно я сохраняю свои изменения в другой ветке git, чтобы перебазирование не могло потерпеть неудачу. Я использую git rebase master
в своей тематической ветке, чтобы обновить его. Затем я переключаюсь на ветку master
и использую git merge
, чтобы включить изменения из моей тематической ветки в master
(это ускоренная перемотка вперед из-за перебазирования ).
Мое объяснение ниже объясняет, почему это не механически необходимо, но я согласен, что это хорошая идея. Ваши изменения могут не вызывать конфликтов с точки зрения различий и слияния, но если вы dcommit
ваш код, не получая последние изменения из 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
их в свою локальную главную
ветку, поэтому она опережает git-svn
.
$ git log --oneline --decorate aa70eca (master) Added a line to foo. 7e72290 (git-svn) Initial commit.
Вы не осознавали, что ваш друг уже внес изменения в bar.txt
как svn revision 2.
Теперь, когда вы запускаете git svn dcommit
из ] master
, git будет искать наборы изменений между тем местом, где вы находитесь, и тем местом, где остановился git-svn
. В этом случае у вас только один: aa70eca
. git пытается отправить эту разницу в ваш репозиторий 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. Когда git-svn затем синхронизировал вашу локальную историю svn с репозиторием svn, он извлек все новые коммиты , включая изменение, которое вы только что отправили в svn . Вы заметите, что это изменение ( d4a7b84
) имеет хэш SHA, отличный от того, который использовался в git ( aa70eca
). Это связано с множеством причин: разные временные метки фиксации, потенциально разные имена авторов, git-svn-id
в журнале фиксации, полученной из svn, и различное происхождение - полученный svn r3 имеет r2 в качестве его родителя, но ваш коммит git произошел от r1.
В этом сценарии после выборки была обнаружена разница между текущим заголовком git ( master
) и SVN, поскольку содержимое в r2 изменилось foo.txt
. В результате git-svn
будет перебазирован.
Если я внесу изменения, и за это время не произошло никаких других коммитов svn (или я выполнял git svn rebase
, чтобы поддерживать актуальность), то git-svn
выиграет. не нашел разницы между головой и 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