Отказ от ответственности: Я вообще делать тенденцию бежать 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
re git svn rebase не требуется перед тем, как «совершить»: совершая, вы имеете в виду git svn dcommit right? Отдельно, вы не имеете в виду, Я также смущен многими вещами во втором абзаце. 1) Есть ли смысл реимпорта? 2) Вы утверждаете, что вы это сделали из содержимого сообщений о фиксации? – allyourcode
3) Что вы подразумеваете под «git-svn» можно сбросить содержимое, полученное из-svn »? Я думал, что сброс git используется для удаления изменений из промежуточной области; в то время как вы, кажется, говорите, что сброс изменений, на которые указывает текущая ветка. 4) Как любые изменения не могут быть перенесены в svn после выполнения git svn dcommit? Разве эта команда не нажимает все изменения с моего локального репозитория git на удаленное svn-репо? – allyourcode
Я переписал большую часть своего ответа, чтобы включить примеры, которые должны иллюстрировать, почему выборка + перезагрузка после dcommit имеет решающее значение. Надеюсь, он должен обратиться к пунктам 1 и 2. – MikeSep