Бесконечная история 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