Возможно ли иметь хранилище Subversion в качестве подмодуля Git? - PullRequest
151 голосов
/ 21 января 2009

Есть ли способ добавить репозиторий Subversion в качестве подмодуля Git в мой репозиторий Git?

Что-то вроде:

git-svn submodule add https://svn.foo.com/svn/proj --stdlayout svn-project

Где https://svn.foo.com/svn/proj указывает на хранилище Subversion.

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

Ответы [ 6 ]

126 голосов
/ 21 января 2009

Нет. Лучше всего было бы установить зеркало хранилища svn в отдельном хранилище git.

git svn clone -s http://subversion.example.com/ mysvnclone
cd mysvnclone
git remote add origin git@example.com:project.git
git push origin master

Затем вы можете добавить репозиторий git в качестве подмодуля в исходный проект

cd /path/to/gitproject
git submodule add git://example.com/project.git -- svn-project
git add svn-project
git commit -m "Add submodule"

Существует одно концептуальное различие между svn: externals и git submodule, которое может сбить вас с толку, если вы подходите к этому с точки зрения подрывной деятельности. Подмодуль git привязан к предоставленной вами ревизии. Если «upstream» меняется, вам нужно обновить ссылку на ваш подмодуль.

Итак, когда мы ресинхронизируемся с восходящей Subversion:

cd /path/to/mysvnclone
git svn rebase
git push

... проект git по-прежнему будет использовать исходную ревизию, которую мы зафиксировали ранее. Для обновления до svn HEAD вам нужно будет использовать

cd /path/to/gitproject/svn-project
git checkout master
git pull
cd ..
git add svn-project
git commit -m"Update submodule"
8 голосов
/ 18 мая 2009

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

На сервере я запускаю:

GIT_DIR=<projectname>.git git init
cd <projectname>.git/
GIT_DIR=. git svn init svn://example.com/trunk
GIT_DIR=. git svn fetch
git gc

Это настраивает мой репо, и у меня есть скрипт cron для его обновления:

#!/usr/bin/python

import os, glob

GIT_HOME='/var/www/git'

os.chdir(GIT_HOME)
os.environ['GIT_DIR']='.'
gits = glob.glob('*.git')
for git in gits:
  if not os.path.isdir(git):
    continue
  os.chdir(os.path.join(GIT_HOME, git))
  if not os.path.isdir('svn/git-svn'):
    #Not a git-svn repo
    continue

  #Pull in svn updates
  os.system('git svn fetch && git gc --quiet')
  #fix-svn-refs.sh makes all the svn branches/tags pullable
  os.system('fix-svn-refs.sh')
  #Update the master branch
  os.system('git fetch . +svn/git-svn:master && git gc --quiet')`

Это также требует fix-svn-refs.sh от http://www.shatow.net/fix-svn-refs.sh Это было главным образом вдохновлено: http://gsocblog.jsharpe.net/archives/12

Я не уверен, зачем здесь нужен git gc, но я не смог обойтись без git pull.

Итак, после всего этого вы можете использовать подмодуль git, следуя инструкциям rq.

5 голосов
/ 09 декабря 2011

В настоящее время git-svn не поддерживает svn: externals . Но есть два других инструмента, которые могут вам помочь:

  1. SubGit

    SubGit - это решение на стороне сервера, оно обеспечивает доступ Git к хранилищу Subversion и наоборот. Вы можете обратиться к документации для получения более подробной информации, но в целом SubGit довольно прост в использовании:

    $ subgit configure --layout auto $SVN_URL $GIT_REPO
    

    Приведенная выше команда обнаружит расположение веток в проекте SVN, а затем создаст пустой пустой Git-репозиторий, готовый для зеркалирования проекта SVN. Вас могут попросить ввести учетные данные, если они не сохранены в кэше учетных данных SVN в каталоге ~ / .subversion. Вы также можете настроить $GIT_REPO/subgit/authors.txt для сопоставления имен авторов SVN с идентификаторами Git.

    $ subgit install $GIT_REPO
    $ ... let initial translation complete ... 
    $ TRANSLATION SUCCESSFUL
    

    В данный момент у вас есть хранилище Subversion, подключенное к недавно созданному хранилищу Git. SubGit переводит ревизию SVN в коммит Git при каждом svn commit, а коммит Git в ревизию SVN при каждом git push.

Все, что вам нужно дальше, - это сделать репозиторий Git доступным для коммиттеров. Для этого взгляните на git-http-backend . Затем вы можете добавить созданный Git-репозиторий как обычный субмодуль. SubGit также доступен в качестве дополнения для Bitbucket Server, чтобы узнать больше, ознакомьтесь с здесь . Таким образом, нет необходимости использовать какие-либо внешние инструменты, такие как git-svn или любые другие.

SubGit является проприетарным программным обеспечением, но оно бесплатно для небольших компаний (до 10 коммиттеров), научных проектов и проектов с открытым исходным кодом.

  1. SmartGit

    SmartGit заменяет git-svn на стороне клиента. Более подробную информацию о его функциях вы можете найти здесь .

    В частности, SmartGit поддерживает оба подмодуля git и svn: externals , вы можете смешивать их в своем хранилище.

    SmartGit является проприетарным программным обеспечением, но оно бесплатно для некоммерческого использования.

4 голосов
/ 18 июля 2010

В дополнение к тому, что сказал rq, другим методом будет использование стороннего проекта "externals" (http://nopugs.com/ext-tutorial),, который лучше имитирует работу внешних ссылок svn. С внешними вы можете отслеживать репозитории git или svn и выглядит проще перенести ваши изменения вверх по течению в эти репозитории. Однако требуется, чтобы участники проекта загрузили и установили отдельный пакет.

Я еще не использовал субмодули или внешние устройства; Тем не менее, я потратил несколько часов, читая обо всех альтернативах, и похоже, что внешнее будет лучше соответствовать моим потребностям. Об этой и других пользовательских методах есть отличная дискуссия в главе 15 «Контроль версий с помощью Git» Джона Лелигера (http://oreilly.com/catalog/9780596520120),, которую я настоятельно рекомендую.

0 голосов
/ 23 ноября 2017

Ну, есть git-remote-testsvn, так что я думаю, что-то вроде

git submodule add testsvn::http://www.telegraphics.com.au/svn/bzquips/trunk/ \
    module/bzquips

должно работать. Есть ли это?

0 голосов
/ 21 января 2009

Piston переписывается для поддержки этого, и наоборот, плюс существующий URL Subversion в хранилище Subvresion и git + git.

Проверьте Поршень Github Хранилище .

К сожалению, он, похоже, не был выпущен.

...