Возможно ли иметь репозиторий 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 и затем использовать его в качестве подмодуля.

6 150

6 ответов:

нет. Лучше всего было бы настроить зеркало репозитория 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, которое может сбить вас с толку, если вы подойдете к этому с точки зрения subversion. Подмодуль git привязан к ревизии, которую вы ему даете. Если" вверх по течению " изменения, то вы должны обновить ссылка на ваш подмодуль.

поэтому, когда мы повторно синхронизируемся с восходящей 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"

Я только что прошел через это. Я делаю что-то похожее на 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.

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

  1. SubGit

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

    $ subgit configure --layout auto $SVN_URL $GIT_REPO
    

    над командой будет обнаружьте макет ветвей в проекте SVN, а затем создайте пустой пустой репозиторий Git, готовый к зеркальному отражению проекта SVN. Вас могут попросить ввести учетные данные, если они уже не хранятся в кэше учетных данных SVN в~/.каталог диверсии. Вы также можете настроить $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 коммиттеров), академических и открытых проектов.

  1. SmartGit

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

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

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

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

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

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

проверить поршневой репозиторий Github.

к сожалению, он, кажется, не был выпущен.

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

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

должны работать. Так ли это?