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


154

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

Ответы:


127

Нет. Лучше всего было бы установить зеркало хранилища 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"

1
Вы пробовали эти коды, прежде чем публиковать здесь? подмодули не могут работать должным образом на git svn.
xhan

4
@ xhan да, и я не рекомендую смешивать git-svn и подмодули в одном репозитории. Клон, использующий git-svn, является лишь мостом для создания нативного клона git репозитория svn.
Ричк

Прости. Я не нашел, чтобы вы использовали две папки, чтобы действовать как подмодули. хороший трюк
xhan

Хорошая техника. Вам не нужен шаг 'git init --bare' на сервере, прежде чем отправлять туда репозиторий git-svn? Я должен был сделать это.
Клейтон Стэнли,

Возможно, это не значение по умолчанию, но вы можете привязать svn: externals к конкретной ревизии, как это делают подмодули git.
13:05

8

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


Можно подумать, что вы могли бы даже сделать это как закрепить коммит.
Андрес Яан Тэк

6

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


Как subgit( subgit.com/documentation/… ), так и smartgitподдерживаются svn:externalsодинаковым образом явным .gitsvnextmodulesфайлом в рабочей копии. Это означает, что вам все еще нужно использовать это программное обеспечение для извлечения внешних ресурсов, и вы не можете использовать базовую gitутилиту для извлечения этих внешних ресурсов непосредственно с внешнего сервера git hub, например githubили gitlab. Таким образом, исходники, размещенные snv:externalsна внешнем сервере git hub, не будут доступны для просмотра и загрузки без этого программного обеспечения, которое все еще является серьезной проблемой.
Андри

4

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

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


0

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

Посмотрите поршневое хранилище Github .

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


3
Поршень не выдержит, когда вам это понадобится больше всего;), поэтому я не рекомендую этого. Плюс больше нет никаких исправлений для поршня.
Хенрик

0

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

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

должно сработать. Является ли?

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.