Віддалене відділення від 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
на обох. Що може пояснити різницю?