2009-04-28 2 views
131

Как я могу использовать fork и сохранять синхронизацию с репозиторием Subversion Google Code, к которому у меня нет доступа на запись, в репозиторий GitHub?Вилка и синхронизация репозитория Subversion Google Code в GitHub

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

Я знаю о git-svn и использовал его перед тем, как переходить и переходить в репозиторий Subversion, с которым я имел полный контроль. Но я не знаю, как синхронизироваться с репозиторием Google Subversion.

ответ

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 [email protected]: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, [пульты/происхождение/мастер] ветка там. И вы вернетесь к сценарию на первой диаграмме ASCII.

Проблема в том, как вы работаете с изменениями в миксе? Идея заключается в том, что вы никогда не совершаете на той же ветке, что вы git-svn-rebase-ing и git-pushing. Для ваших изменений требуется отдельная ветка. В противном случае вы в конечном итоге замените свои изменения поверх Subversion, что может расстроить любого, кто клонирует ваш репозиторий Git. Подписывайтесь на меня? Хорошо, поэтому вы создаете ветку, назовем ее «функциями». И вы делаете фиксацию и выталкиваете ее в GitHub в ветви функций. Ваш gitk будет выглядеть примерно так:

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 мастера, вы можете себе представить, [перепятнышки/происхождение/мастер] быть в той же точке, как мастер. Но у вашей ветки функций нет изменений. Теперь ваш выбор состоит в том, чтобы объединить мастер в функции или функции переадресации.Слияние будет выглядеть так:

git checkout features 
git merge master 

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

Затем вы выталкиваете функции в GitHub. Я оставил пульт дистанционного управления для мастера, чтобы сэкономить место, они будут в той же точке, что и [мастер].

Подход к перестановке немного более злобный - вам нужно будет нажать на --force, поскольку ваш толчок не будет быстрым слиянием (вы вытащите ветку функций из-под кого-то, кто ее клонировал). На самом деле это не так хорошо, но никто не может остановить вас, если вы решите. Это также делает некоторые вещи более легкими, например, когда патчи принимаются в потоке в слегка переработанной форме. Это избавит вас от необходимости возиться с конфликтами, вы можете просто переустановить -skip восходящие патчи. Во всяком случае, перебазироваться будет выглядеть так:

git rebase master features 

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

И тогда вам придется git push --force этого. Вы можете понять, зачем вам это нужно, история имеет большой старый раскол от [remotes/origin/features] до новой текущей пост-перестановки [features].

Все это работает, но это очень много усилий. Если вы станете постоянным участником, лучшим вариантом будет некоторое время работать так, чтобы отправить некоторые исправления вверх и посмотреть, можете ли вы получить доступ к транзакции для Subversion. В противном случае, возможно, не подталкивайте свои изменения к GitHub. Держите их на месте и попробуйте, и пусть они будут приняты вверх по течению в любом случае.

+0

Спасибо за отличные инструкции. ('git' noob здесь.) Быстрый вопрос. Я сделал это против большого репо SVN, и он вышел до ~ 141 мегабайта. Я подтолкнул его к github, а затем клонировал его обратно, и он вышел до 130 мегабайт. Я запускал git gc на обоих. Что может объяснить разницу? – mpontillo

+0

... понял. Мне нужно «git push origin --mirror». – mpontillo

+0

Работала как шарм, теперь мне просто нужно сказать оригинальным разработчикам googlecode, чтобы использовать github со мной: D – electblake

1

Хмм .. В моей компании я делал почти то же самое. Просто наличие обоих .svn и .git repo в том же каталоге (вы проверяете svn repo и создаете git repo в этой рабочей копии).

Тогда использование svn up и git push сделал вещь. Конечно, если вы расходитесь много, вам придется объединять вещи вручную.

+0

Ja, но я хочу избежать метаданных .svn и надеялся, что git сможет использовать репозитории svn в качестве нисходящего мастера – optixx

+0

Так что это невозможно использовать git-svn для проверки repo и git push to github? –

0

Я не совсем уверен, что вы хотите, но, конечно же, вы можете вытащить из репозитория subversion и нажать на репозиторий Git из той же рабочей копии. И вы также можете вернуть git svn dcommit в репозиторий subversion. Тем не менее, вы не можете синхронизировать репозиторий GitHub с репозиторием subversion. Кроме того, когда вы выполняете свою рабочую копию, еще не находящуюся в репозитории subversion, вам нужно будет переустановить их, если репозиторий subversion был обновлен, заставляя вас git push --force «новый» обязывает GitHub.

10

Прогулка для синхронизации от Google Code до GitHub доступна по адресу fnokd.com. Автор использует постоянный удаленный сервер и задание cron для автоматизации синхронизации и сохраняет соединительную линию SVN в ветке GitHub под названием «поставщик».

2

GitHub теперь поддерживает прямой импорт проектов подрывной деятельности (см. http://help.github.com/import-from-subversion/). Просто создайте новое репо и нажмите «Импортировать из Subversion» на экране «Следующие шаги». Однако он не поддерживает дальнейшую синхронизацию: /.

+0

Этот метод больше не существует – magnetik

+0

Вместо этого используйте https://import.github.com/new. См. Https://help.github.com/articles/importing-from-subversion/. –

15

svn2github служба

Сайт http://svn2github.com/ предоставляет услугу раскошелиться любым общедоступным репозиторий SVN на Github (в https://github.com/svn2github/projectname). Я попробовал; после нажатия «Сделать зеркало» он, по-видимому, ничего не сделал в течение нескольких секунд и отобразил сообщение «ошибка», но он действительно сработал. Создан новый репозиторий, содержащий код из репо SVN.

Затем вы должны разблокировать созданный репозиторий и работать на своей собственной вилке. Затем вы отправляете свои изменения в восходящий проект, используя их bugtracker.

Рассматривая существующие репозитории под пользователем Github службы (например, «svn2github, нажатый на master svn2github/haxe 5 часов назад»), он, похоже, регулярно втягивает изменения из репозитория SVN. Нет информации о том, кто управляет службой на веб-сайте, поэтому я бы не стал делать ставку на то, что она будет продолжаться бесконечно, но теперь она работает (и если она когда-либо снижается, вы все равно можете вручную обновить свою вилку).

Launchpad

Если вы не установите на использовании Git и Github, другой альтернативой является использование Launchpad.net. Launchpad может автоматически импортировать SVN (также CVS) репозитории в личную ветвь bzr. Для этого создайте проект Launchpad, затем перейдите к the new import page, выберите Subversion и введите URL-адрес (например, http://projectname.googlecode.com/svn/trunk/). В зависимости от размера проекта первоначальный импорт может занять до нескольких часов. Последующий импорт будет выполняться периодически.

Дополнительную документацию см. В разделе VCS Imports on Launchpad Help.

0

Я нашел эти инструкции на Yu-Jie Lin «s блоге:

Первый клон репозитория Subversion и нажать на Git:

git svn clone https://foo.googlecode.com/svn/ git-foo 
cd git-foo 
git remote add git-foo [email protected]: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 
Смежные вопросы