Возможно ли иметь репозиторий 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 проектов.
-
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
должен работать. Это?