Розкладіть і синхронізуйте сховище Subversion Google Code в GitHub


131

Як я можу розблокувати та зберігати синхронізацію із сховищем Subversion Google Code, до якого я не маю доступу для запису, у сховище GitHub?

Я хочу мати можливість розробляти власні функції в моєму сховищі Git, але також хочу синхронізуватися з сховищем Subversion Google Code. Щоб отримати виправлення з боку проекту Google Code.

Я знаю про git-svn і використовував його перед тим, щоб переходити до сховища Subversion, над яким я мав повний контроль. Але я не знаю, як підтримувати синхронізацію зі сховищем Subversion Google Code.

Відповіді:


178

Віддалене відділення від git-svn майже все одно, що і звичайне пульт Git. Таким чином, у вашому локальному сховищі ви можете мати клон git-svn і висувати зміни на GitHub. Гіт не хвилює. Якщо ви створите свій git-svn-клон і висунете такі самі зміни до GitHub, у вас з’явиться неофіційне дзеркало сховища Google Code. Решта - ванільна Гіт.

git svn clone http://example.googlecode.com/svn -s
git remote add origin git@github.com:example/example.git
git push origin master

Тепер, коли у вас це є, періодично вам доведеться синхронізувати сховище Subversion з Git. Це буде виглядати приблизно так:

git svn rebase
git push

У gitk чи що завгодно це виглядатиме приблизно так:

o [master][remotes/trunk][remotes/origin/master]
|
o
|
o

А коли ти біжиш git svn rebase, у тебе буде таке:

o [master][remotes/trunk]
|
o
|
o [remotes/origin/master]
|
o
|
o

Таким чином, тепер запущений процес git pushвиштовхує цю команду до GitHub, [Remotes / origin / master] там. І ви повернетесь до сценарію в першій діаграмі мистецтв ASCII.

Зараз проблема полягає в тому, як ви працюєте зі своїми змінами в суміші? Ідея полягає в тому, що ви ніколи не займаєтеся тією ж гілкою, яку ви git-svn-rebase-ing та git-push. Для змін вам потрібна окрема гілка. В іншому випадку, ви в кінцевому підсумку опублікуєте свої зміни поверх тих, що піддаються Subversion, що може засмутити кожного, хто клонує ваше сховище Git. Слідуй за мною? Гаразд, тому ви створюєте гілку, назвемо її "функціями". І ви берете на себе зобов’язання і виштовхуєте його в GitHub до гілки функцій. Ваш гітк виглядатиме приблизно так:

o [features][remotes/origin/features]
|
o
|
o [master][remotes/trunk][remotes/origin/master]
|
o

Тут у вас є філія ваших функцій на пару комісій перед гілкою Google Code, правда? То що відбувається, коли ви хочете включити нові речі з Google Code? Ви запустили б git svn rebaseперший і отримаєте це:

                           o [features][remotes/origin/features]
[master][remotes/trunk] o  |
                        |  o
                        o /
                        |/
                        o[remotes/origin/master]
                        |
                        o

Якщо ви git pushосвоїте, ви можете уявити, що [Remotes / origin / master] знаходиться в тій же точці, що і Master. Але у вашій функції немає змін. Тепер ваш вибір - об'єднати головний у функції або перезавантажити функції. Злиття виглядало б так

git checkout features
git merge master 

            o [features]
           /|
          / o [remotes/origin/features]
[master] o  |
         |  o
         o /
         |/
         o
         |
         o

Потім ви висуваєте функції до GitHub. Я залишив дистанційні для майстра, щоб заощадити місце, вони опиниться в тому ж самому пункті, що і [master] .

Підхід до ребазування трохи зліший - вам доведеться натиснути на - сила, оскільки ваш натиск не буде швидким злиттям вперед (ви витягнете гілку функції з-під того, хто її клонував). Насправді це не вважається нормальним, але ніхто не може зупинити вас, якщо ви налаштовані. Деякі речі також полегшуються, наприклад, коли патчі приймаються вище за течією у трохи переробленому вигляді. Врятувати не доведеться зіткнутися з конфліктами, ви можете просто перезавантажити --скоротити виправлені патчі. У будь-якому випадку, база даних буде такою:

git rebase master features

         o [features]
         |
         o
         |  o [remotes/origin/features]
[master] o  |
         |  o
         o /
         |/
         o
         |
         o

І тоді вам би довелося до git push --forceцього. Ви можете зрозуміти, чому це потрібно змусити, історія має великий старий розкол від [видалення / походження / функції] до нового поточного пост-ребазування [функції] .

Це все працює, але це докладе багато зусиль. Якщо ви збираєтесь стати постійним дописувачем, найкращим варіантом буде деякий час працювати таким чином, надіслати кілька виправлень вгору за течією та побачити, чи зможете ви отримати доступ до Subversion. Якщо цього не зробити, можливо, не підштовхуйте зміни до GitHub. Тримайте їх місцевими і будь-ласка, намагайтеся їх прийняти вгору за течією.


Дякую за чудові інструкції. ( gitтут нуб.) Швидке запитання. Я зробив це проти великого репортажу SVN, і він склав ~ 141 мегабайт. Я натиснув його на github, а потім клонував його назад, і він вийшов до 130 мегабайт. Я бігав git gcна обох. Що може пояснити різницю?
mpontillo

... з'ясував це. Мені потрібно було git push origin --mirror.
mpontillo

Працювало як шарм, тепер мені просто потрібно сказати оригінальним розробникам googlecode, щоб використовувати зі мною github: D
electblake

Це не працювало для мене з -sваріантом для git svn clone, але без нього решта працювала чудово.
користувач1027169

15

сервіс svn2github

Веб-сайт http://svn2github.com/ надає послугу перекидання будь-якого загальнодоступного сховища SVN на Github (за адресою https://github.com/svn2github/projectname ). Я спробував це; натиснувши "Зробити дзеркало", воно, мабуть, не робило нічого протягом декількох секунд і виводило повідомлення "помилка", але насправді спрацювало. Фактично створено новий сховище, що містить код із репо-файлу SVN.

Потім ви роздвоюєте створене вами сховище та працюєте над власною форкою. Потім ви будете надсилати свої зміни до висхідного проекту, використовуючи їх помилку.

Переглядаючи існуючі репозиторії під користувачем служби Github (наприклад, "svn2github натиснуто на майстер у svn2github / haxe 5 годин тому"), воно, схоже, регулярно тягне зміни зі сховища SVN. Немає інформації про те, хто запускає послугу на веб-сайті, тому я б не ставлю на неї ставку продовжувати працювати нескінченно, але вона працює зараз (і якщо вона коли-небудь знизиться, ви все одно можете оновити вилку вручну).

Стартова площадка

Якщо ви не налаштовані на використання Git та Github, іншою альтернативою є використання Launchpad.net. Стартовий панель може автоматично імпортувати SVN (також CVS) сховища в особисту гілку bzr. Для цього створіть проект Launchpad, потім перейдіть на нову сторінку імпорту , виберіть Subversion і введіть URL-адресу (наприклад,http://projectname.googlecode.com/svn/trunk/ ). Залежно від розміру проекту, початковий імпорт може зайняти до кількох годин. Подальший імпорт буде періодично виконуватись.

Для отримання додаткової документації див . Довідку VCS Imports on Launchpad Help .


10

Програма для синхронізації з коду Google до GitHub доступна на веб- сайті fnokd.com . Для автоматизації синхронізації автор використовує постійний віддалений сервер і завдання cron, а також зберігає ствол SVN у гілці GitHub під назвою "постачальник".


2

Тепер GitHub підтримує прямий імпорт підривних проектів (див. Http://help.github.com/import-from-subversion/ ). Просто створіть нове репо, а потім натисніть "Імпорт з підриву" на екрані "Наступні кроки". Однак він не підтримує подальшу синхронізацію: /.


Цей метод вже не існує
magnetik


1

Хм .. У моїй компанії я робив майже те саме. Просто маючи і .svn, і .git repo в одному каталозі (ви оформили замовлення svn repo і створили git repo в цій робочій копії).

Тоді за допомогою svn up та git push зробили цю справу. Звичайно, якщо ви багато розходяться, вам доведеться об’єднати речі вручну.


Я правильно, але я хочу уникнути наявності .svn метаданих і сподівався, що git зможе використовувати svn repos як майстер потокового потоку
optixx

Так чи не можна використовувати git-svn для оформлення репо і git push до github?
Marcin Gil

0

Я не зовсім впевнений, що саме ви хочете, але, звичайно, можете витягнути з сховища субверсії та перейти до сховища Git з тієї ж робочої копії. Ви також можете git svn dcommitповернутися до сховища субверсії. Однак ви не можете зробити синхронізацію сховища GitHub проти сховища субверсії. Крім того, якщо у вашій робочій копії є коміти, які ще не знаходяться в сховищі субверсії, вам потрібно буде їх відновити, якщо сховище субверсії було оновлено, примушуючи вас до git push --force«нових» зобов’язань GitHub.


0

Я знайшов ці вказівки на Ю-Цзе Лін блозі :

Спочатку клонуйте сховище Subversion і натисніть на Git:

git svn clone https://foo.googlecode.com/svn/ git-foo 
cd git-foo
git remote add git-foo git@github.com:username/foo.git 
git push git-foo master

Після введення в сховище Subversion запустіть

cd /path/to/git-foo
git svn fetch 
git svn rebase 
git push git-foo master
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.