Возможно ли иметь репозиторий 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 ответов:
нет. Лучше всего было бы настроить зеркало репозитория 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. Но есть два других инструмента, которые могут помочь вам:
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 коммиттеров), академических и открытых проектов.
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.
к сожалению, он, кажется, не был выпущен.