Разветвите и синхронизируйте репозиторий Google Code Subversion с GitHub - PullRequest
131 голосов
/ 28 апреля 2009

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

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

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

Ответы [ 7 ]

178 голосов
/ 28 апреля 2009

Удаленная ветка от git-svn почти такая же, как и у обычного Git. Таким образом, в вашем локальном репозитории вы можете получить клон git-svn и отправить изменения в GitHub. Git не волнует. Если вы создадите свой клон git-svn и внесете те же самые изменения в GitHub, у вас будет неофициальное зеркало репозитория Google Code. Остальное ванильное Git.

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

git checkout features
git merge master 

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

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

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

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. Держите их локально и в любом случае попытайтесь принять их вверх по течению.

15 голосов
/ 23 июля 2012

svn2github service

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

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

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

Launchpad

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

Для получения дополнительной документации см. Импорт VCS в справочной системе Launchpad .

10 голосов
/ 10 декабря 2009

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

2 голосов
/ 14 декабря 2011

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

1 голос
/ 28 апреля 2009

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

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

0 голосов
/ 26 октября 2013

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

Сначала клонируйте репозиторий 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
0 голосов
/ 28 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...