Является мерзавец svn переосновой, требуемой перед мерзавцем svn dcommit?

Я читаю об использовании мерзавца как 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?

14
задан P̲̳x͓L̳ 8 December 2016 в 15:29
поделиться

1 ответ

Отказ от ответственности: Я обычно действительно обычно запускаю 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
19
ответ дан 1 December 2019 в 13:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: