Git -svn и удаленная синхронизация репликации git

На моем рабочем месте мы используем SVN для контроля версий. Когда я узнал об этом, я переключился на git -svn, и недавно я решил синхронизировать некоторые из моих личных ветвей с другим удаленным репо git. Затем рабочий процесс состоит из перезагрузки и перехода на SVN-репо через git -svn при работе с отдельными ветвями частных функций, которые перенаправляются на удаленный репозиторий git, поэтому я могу работать с ними дома, если это необходимо.

Теперь, каждый раз, когда я переустанавливаю из git -svn, мой удаленный репозиторий git просит сначала вытащить. Иногда изменения не сливаются чисто при выполнении тяги, хотя, предположительно, удаленное репо должно содержать те же коммиты, что и моя локальная, синхронизированная с svn. В последнее время я прибегал к удалению удаленных ветвей, прежде чем снова их перенаправить на дистанционное репо, но это не может быть прав.

Является ли git просто не настроенным для такого рода рабочих процессов, или я делаю что-то неправильно?

Спасибо!

Ответ 1

Во-первых, благодаря Мэтью за ссылки - они были полезны для меня, когда я пришел к собственному решению этой проблемы.

Это можно сделать, но оговорки состоят в том, что это требует некоторой осторожности и, вероятно, имеет ограничения по количеству вовлеченных коммиттеров. Мой вариант использования - это в основном то, что описывает митьяк; один пользователь, который имеет потребность и/или хочет использовать два удаленных репозитория, один SVN и другой Git. В моем случае первый работает за брандмауэром, а другой - вне компании (также частный). Цель состоит в том, чтобы иметь возможность работать с локальной копией репозитория с помощью Git и поддерживать оба удаленных репозитория счастливыми.

Моя процедура:

Все это зависит от того, что git svn dcommit изменяет SHA1, связанный с оригинальной записью Git. С этой точки зрения, после совершения локального совершения, я [опционально git svn rebase then] git svn dcommit, создавая окончательный SHA1. В этот момент я подталкиваю к удаленному репозиторию Git. Если в качестве Chacon указано все, что вы хотите сделать, это обеспечить более эффективную точку клонирования, используя Git. Но вы также можете захотеть:

  • нажмите на удаленный репозиторий Git из другого локального репозитория "pure git", а затем
  • синхронизация гибридного репозитория git/svn, а затем
  • перетаскивание этих изменений в репозиторий SVN.

Шаг 1 не представляет проблемы; после фиксации в локальном "чистом git" репозитории git push в удаленном репозитории Git.

Шаг 2 снова не проблема; обратно в ваш гибридный репозиторий git/svn, git pull изменения из удаленного репозитория Git. На этом этапе SHA1, связанный с недавно выведенными ревизиями, синхронизируется с репозиториями в удаленном репозитории Git.

Шаг 3 - это процесс, который немного сложнее. Вы можете git svn dcommit изменить эти изменения, как описано выше, чтобы подтолкнуть их к репозиторию SVN, но тогда ситуация немного отличается от описанной выше. В этом случае у вас теперь есть те же ревизии в удаленных хранилищах SVN и Git, но они имеют разные SHA1 из-за dcommit. Я обрабатываю это следующим образом:

Во время вытягивания на шаге 2 я отмечаю ассоциированное начало SHA1; например.

  git pull
  [email protected] password: 
  remote: Counting objects: 5, done.
  remote: Compressing objects: 100% (3/3), done.
  remote: Total 3 (delta 0), reused 0 (delta 0)
  Unpacking objects: 100% (3/3), done.
  From ssh://example.org/pub/scm/demonstrate
    34b6260..17cd887  master     -> origin/master
  Updating 34b6260..17cd887
  Fast forward
    file3 |    2 +-
    1 files changed, 1 insertions(+), 1 deletions(-)

Итак, здесь SHA1 представляет интерес 34b6260. git log origin должен подтвердить, что это последний фиксатор в удаленном репозитории Git, который имеет связанный с ним git -svn-id. Затем я делаю следующее:

git push -f origin 34b6260:master

выполнение принудительного обновления удаленного репозитория для исключения "чистого git" означает, что я сделал из "чистого git" локального репозитория - используйте с осторожностью! В этом случае я знаю, что у меня эти локальные локали; у них просто есть SHA1 из dcommit. Затем я git push удаленный репозиторий, добавляя "git -svn-id" -версии коммитов, которые я только что удалил, и удаленные репозитории находятся в синхронизации.

Повторная синхронизация локального репозитория "pure git" с удаленным репозиторием Git является последним этапом, но подобный уход дает удовлетворительные результаты. В этом случае удаленный репозиторий Git теперь содержит "git -svn-id" -версии коммитов, тогда как локальный "чистый git" репозиторий по-прежнему содержит исходные SHA1. Самый простой способ справиться с этим - git fetch из удаленного репозитория Git, затем git reset --hard origin, чтобы локальный репозиторий Git отображал состояние удаленного.

Ответ 2

В глава 9.1 из Pro Git Скотт Чакон утверждает:

Не переписывайте свою историю и пытайтесь снова нажать, а затем не переходите в параллельный репозиторий Git, чтобы одновременно сотрудничать с другими разработчиками Git. Subversion может иметь только одну линейную историю, и запутать ее очень легко. Если вы работаете с командой, а некоторые из них используют SVN, а другие используют Git, убедитесь, что все используют сервер SVN для совместной работы - это упростит вашу жизнь.

На основе утверждений:

  • "Не нажимайте на параллельный репозиторий Git" и
  • "Subversion может иметь только одну линейную историю",

кажется, что Subversion не может обрабатывать ваш желаемый рабочий процесс, не отрываясь от вашего удаленного репозитория Git, чтобы Subversion имела только одну линейную историю.

Обновление 01-Sep-10, 8:37 PM

Возможно, вы захотите проверить раздел Дополнительно: привязка другого удаленного репозитория Git к вашим Git и GIT -SVN в статье "Синхронизация репозиториев по заливу Дейа".

Ответ 3

Возможно, этот поток может представлять интерес, хотя git -svn может измениться с тех пор.

Я бы использовал fetch вместо pull и быстро посмотрел, будут ли конфликты с помощью инструмента, такого как gitk, перед выполнением слияния.