Бесконечная история GIT - что я здесь делаю неправильно?

Я хочу, чтобы локальный репозиторий GIT синхронизировался как с удаленным GIT, так и с хранилищем SVN.

Я выполняю следующие шаги:

> git push
Everything up-to-date

> git pull
Already up-to-date.

Хорошо, мои удаленные репозитории GIT кажутся прекрасными до сих пор.

> git svn rebase
First, rewinding head to replay your work on top of it...
Applying: Fixing some javadoc problems.
Using index info to reconstruct a base tree...
<stdin>:13: trailing whitespace.
\t
<stdin>:21: trailing whitespace.
\t\t\t\t<configuration>
<stdin>:22: trailing whitespace.
\t\t\t\t\t<links>
<stdin>:23: trailing whitespace.
\t\t\t\t\t\t<link>http://java.sun.com/javase/6/docs/api/</link>
<stdin>:24: trailing whitespace.
\t\t\t\t\t</links>
warning: squelched 1 whitespace error
warning: 6 lines add whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging lilith-parent/pom.xml
Я заменил вкладки \t для ясности.

Это слияние, которое я уже сделал, ранее...
Теперь у меня есть новая локальная версия.

> git svn dcommit
[commits the new version to SVN... again...]

Теперь мастер и соединительная линия находятся во главе моего локального репозитория.

> git push
To ssh://[email protected]/gitroot/lilith/lilith
! [rejected] master -> master (non-fast forward)
error: failed to push some refs to 'ssh://[email protected]/gitroot/lilith/lilith'

Это означает, что AFAIK, что я должен выполнить pull сначала. Тааак....

> git pull
Already uptodate!
Merge made by recursive.

который возвращает меня в самое начало...:( Промыть и повторить.

У меня такое ощущение, что я пропустил здесь довольно важный момент. Может кто-нибудь объяснить это мне?

Ответ 1

Нельзя отслеживать одну ветвь с помощью svn через git-svn и git через push/pull. Вы должны сделать эти две ветки раздельными и сделать git rebase на синхронизированных ветвях локально, когда вы хотите передать фиксации между этими ветвями

Ответ 2

Самая большая подсказка - ошибка в нажатии:

! [rejected] master -> master (non-fast forward)

Это означает, что вы являетесь подразделением subversion, а удаленная ветка git не соглашается на что-то. Некоторые изменения были перенесены/преданы тому, который не находится в другом. Запустите gitk --all, и он должен дать вам представление о том, что пошло не так - ищите "вилки" в истории. Следите за ветвями [origin/master], [master] и [trunk]. Происхождение может быть на другой ветке для вашего текущего мастера - git svn rebase может вызвать это.

Как правило, если вы совершаете передачу через svn и git, вам лучше не связывать основную ветвь git, идентичную подрывной, и работать с другой ветвью в git. См. этот другой вопрос о работе с git и subversion.

Ответ 3

Вы также можете просмотреть сообщение в блоге Лучшие методы ветвления с git -svn, в котором есть некоторые полезные советы, связанные с этим.

Если вы хотите избавиться от предупреждений о пробелах, выполните

$ git config --global apply.whitespace nowarn