git-svn и удаленная синхронизация git-репо - PullRequest
10 голосов
/ 02 сентября 2010

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

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

git просто не настроен для такого типа рабочего процесса, или я делаю что-то не так?

Спасибо!

Ответы [ 3 ]

6 голосов
/ 27 сентября 2010

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

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

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

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

  1. отправка в удаленный репозиторий git из другого локального репозитория «чистого git», за которым следует
  2. синхронизирует гибридное хранилище git / svn, а затем
  3. отправка этих изменений в хранилище SVN.

Шаг 1 не представляет проблемы; после фиксации в вашем локальном репозитории "pure 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
  someone@example.org's 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» -версии коммитов, которые я только что удалил, и удаленные репозитории синхронизируются.

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

4 голосов
/ 02 сентября 2010

В глава 9.1 Pro Git , Скотт Чакон сообщает:

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

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

  1. «Не передавайте в параллельный Git-репозиторий» и
  2. «Subversion может иметь только одну линейную историю»,

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

Обновление 01.09.10, 20:37

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

0 голосов
/ 02 сентября 2010

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

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

...