Чи можливо мати сховище 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: зовнішній та 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"

1
Ви пробували ці коди, перш ніж розміщувати їх тут? підмодулі не можуть працювати належним чином у git svn.
xhan

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

вибачте. Я не знайшов, щоб ти використовував дві папки, щоб діяти як підмодулі. приємна хитрість.
xhan

Гарна техніка. Вам не потрібен крок 'git init --bare' на сервері, перш ніж натиснути туди репост git-svn? Мені довелося це зробити.
Клейтон Стенлі

Це, мабуть, не за замовчуванням, але ви можете прив’язати svn: externals до певної версії, як це роблять підмодулі git.
1313

8

Я щойно пройшов через це. Я роблю щось подібне на rq, але трохи інше. Я налаштовую один із своїх серверів для розміщення цих git-клонів svn repos, який мені потрібен. У моєму випадку я хочу лише версії лише для читання, і мені потрібна гола репо на сервері.

На сервері я запускаю:

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.


Можна було б подумати, що ти можеш це зробити навіть як гачок.
Андрес Яан Так

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 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 - це власне програмне забезпечення, але воно безкоштовне для некомерційного використання.


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

4

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

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


0

Поршень переписується, щоб підтримати це, і навпаки, плюс наявна 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.