Возможно ли иметь хранилище 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.