Удаленная ветка от 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. Держите их на месте и попробуйте, и пусть они будут приняты вверх по течению в любом случае.
Спасибо за отличные инструкции. ('git' noob здесь.) Быстрый вопрос. Я сделал это против большого репо SVN, и он вышел до ~ 141 мегабайта. Я подтолкнул его к github, а затем клонировал его обратно, и он вышел до 130 мегабайт. Я запускал git gc на обоих. Что может объяснить разницу? – mpontillo
... понял. Мне нужно «git push origin --mirror». – mpontillo
Работала как шарм, теперь мне просто нужно сказать оригинальным разработчикам googlecode, чтобы использовать github со мной: D – electblake