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

Есть ли способ добавить репозиторий 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, а затем использовать его как подмодуль.

Ответ 1

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

git svn clone -s http://subversion.example.com/ mysvnclone
cd mysvnclone
git remote add origin [email protected]: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, который может вас опрокинуть, если вы приблизитесь к этому с точки зрения подрывной деятельности. Подмодуль git привязан к ревизии, которую вы ему даете. Если изменяется "восходящий поток", вам необходимо обновить ссылку на субмодуль.

Поэтому, когда мы повторно выполняем восходящую подрывную деятельность:

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"

Ответ 2

Я просто прошел через это. Я делаю что-то похожее на 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 script, чтобы его обновить:

#!/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.

Ответ 3

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

  • SubGit

    SubGit является серверным решением, он позволяет Git обращаться к репозиторию Subversion и наоборот. Вы можете обратиться к documenation для получения более подробной информации, но в целом довольно легко использовать 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 commit на каждом svn commit и Git фиксации в ревизии SVN на каждом git push.

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

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

  1. SmartGit

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

    В частности, SmartGit поддерживает как подмодули Git, так и svn: externals, вы можете смешивать их в своем репозитории.

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

Ответ 4

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

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

Ответ 5

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

Отметьте портовый репозиторий Github.

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

Ответ 6

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

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

должен работать. Это?