Google Code Subversion deposunu GitHub'a çatallayın ve senkronize edin


131

Yazma erişimim olmayan bir Google Code Subversion deposu ile bir GitHub havuzuna nasıl çatallayabilirim ve senkronize halde tutabilirim?

Git depomda kendi özelliklerimi geliştirebilmek istiyorum, ancak aynı zamanda Google Code Subversion deposuyla da senkronize etmek istiyorum. Google Code proje tarafından düzeltmeleri getirmek için.

Git-svn hakkında bilgim var ve daha önce üzerinde tam kontrole sahip olduğum bir Subversion deposunda yukarı ve aşağı akış için kullandım. Ancak bir Google Code Subversion deposu ile nasıl senkronize olacağımı bilmiyorum.

Yanıtlar:


178

Git-svn'deki uzak dal, normal bir Git uzaktan kumandasıyla hemen hemen aynıdır. Böylece yerel deponuzda git-svn klonunuzu alabilir ve değişiklikleri GitHub'a gönderebilirsiniz. Git umursamıyor. Git-svn klonunuzu oluşturur ve aynı değişiklikleri GitHub'a gönderirseniz, Google Code deposunun resmi olmayan bir yansımasına sahip olursunuz. Gerisi vanilya Git.

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

Artık buna sahip olduğunuza göre, ara sıra Subversion deposunu Git ile senkronize etmeniz gerekecektir. Şunun gibi görünecek:

git svn rebase
git push

Gitk veya her neyse, bu şuna benzer bir şeye benzeyecektir:

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

Ve koştuğunda git svn rebase, şuna sahip olacaksın:

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

Yani şimdi koşmak git push, bu taahhütleri oradaki [uzaktan / kaynak / ana] dalı olan GitHub'a itecektir . Ve ilk ASCII sanat diyagramındaki senaryoya geri dönersiniz.

Şimdi sorun şu ki, değişikliklerinizi karışıma nasıl uygulayacaksınız? Buradaki fikir şu ki, git-svn-rebase-ing ve git-pushing olduğunuzla aynı şubeye asla bağlanmazsınız. Değişiklikleriniz için ayrı bir şubeye ihtiyacınız var. Aksi takdirde, Subversion'ın üzerine değişikliklerinizi yeniden sıralarsınız, bu da Git deponuzu klonlayan herkesi üzebilir. Beni takip et? Tamam, bir dal yaratın, buna "özellikler" diyelim. Ve bir taahhütte bulunup bunu GitHub'a özellikler dalına aktarırsınız. Gitk'iniz şöyle bir şeye benzeyecektir:

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

Burada özellikler dalınız, Google Code şubesinin önünde birkaç taahhüt var, değil mi? Peki, Google Code'dan yeni şeyler eklemek istediğinizde ne olur? Önce koşarsın git svn rebaseve şunu alırsın:

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

Eğer varsa git pushdışarı usta, hayal edebileceğiniz [uzaktan kumanda / köken / ustası] ustası olarak aynı noktada olmak. Ancak özellik dalınızda değişiklikler yok. Şimdi seçimleriniz ana parçayı özelliklerle birleştirmek veya özellikleri yeniden sunmaktır. Bir birleştirme şöyle görünür

git checkout features
git merge master 

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

Ardından özellikleri GitHub'a aktarırsınız. Ustanın yerden tasarruf etmesi için uzaktan kumandaları bıraktım, [usta] ile aynı noktada olacaklardı .

Rebase yaklaşımı biraz daha kötüdür - zorlamanız gerekir, çünkü itmeniz hızlı ileri birleştirme olmayacaktır (özellikler dalını klonlayan birinin altından çekersiniz). Bunu yapmak pek uygun sayılmaz, ancak kararlıysanız kimse sizi durduramaz. Yamaların biraz yeniden işlenmiş biçimde yukarı akışta kabul edilmesi gibi bazı şeyleri de kolaylaştırır. Çatışmalarla uğraşmaktan kurtarır, sadece yeniden taban oluşturabilir, yukarı akışlı yamaları atlayabilirsiniz. Her neyse, geri ödeme şu şekilde olacaktır:

git rebase master features

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

Ve sonra buna ihtiyacınız olacak git push --force. Neden onu zorlamanız gerektiğini anlayabilirsiniz, geçmişte [uzaktan / başlangıç ​​/ özellikler] ' den yeni mevcut yeniden ödeme sonrası [özellikler] arasında büyük bir eski ayrılık vardır .

Bunların hepsi işe yarıyor, ancak çok fazla çaba gerektiriyor. Düzenli bir katkıda bulunacaksanız, en iyi bahis bir süre böyle çalışmak, yukarı akışa bazı yamalar göndermek ve Subversion'a commit erişimi olup olmadığını görmek olacaktır. Bunu başaramazsanız, belki de değişikliklerinizi GitHub'a göndermeyin. Onları yerel tutun ve yine de yukarı akışta kabul ettirmeye çalışın.


Mükemmel talimatlar için teşekkürler. ( gitçaylak burada.) Hızlı soru. Bunu büyük bir SVN deposuna karşı yaptım ve ~ 141 megabayta çıktı. Onu github'a ittim ve sonra geri klonladım ve 130 megabayta çıktı. İkisine git gcde koştum . Farkı ne açıklayabilir?
mpontillo

... anladım. İhtiyacım vardı git push origin --mirror.
mpontillo

Büyüleyici bir şekilde çalıştı, şimdi sadece orijinal googlecode geliştiricilerine
github'u

Bu, -sseçeneğiyle benim için işe yaramadı git svn clone, ancak onsuz geri kalanı gayet iyi çalıştı.
user1027169

15

svn2github hizmeti

Http://svn2github.com/ web sitesi , herkesin erişebileceği herhangi bir SVN havuzunu Github'a ( https://github.com/svn2github/projectname adresinde ) çatallamak için bir hizmet sağlar . Denedim; "Ayna yap" a basıldığında, görünüşe göre birkaç saniye hiçbir şey yapmadı ve "hata" mesajını görüntüledi, ancak gerçekten işe yaradı. Yeni depo aslında SVN deposundaki kodu içeren oluşturuldu.

Daha sonra oluşturduğu depoyu çatallayabilir ve kendi çatalınız üzerinde çalışırsınız. Daha sonra, değişikliklerinizi hata izleyicilerini kullanarak yukarı akış projesine gönderirsiniz.

Hizmetin Github kullanıcısı altındaki mevcut depolara bakıldığında (ör. "Svn2github, svn2github / haxe'de 5 saat önce ana konuma itildi"), değişiklikleri düzenli olarak SVN deposundan alıyor gibi görünüyor. Web sitesinde hizmeti kimin çalıştırdığına dair hiçbir bilgi yok, bu yüzden süresiz olarak çalışmaya devam edeceğine bahse girmem, ancak şimdilik çalışıyor (ve eğer bir daha düşerse, çatalınızı manuel olarak güncelleyebilirsiniz).

Başlatma

Git ve Github'ı kullanmaya karar vermediyseniz, başka bir alternatif Launchpad.net'i kullanmaktır. Launchpad, SVN (ayrıca CVS) depolarını kişisel bir bzr şubesine otomatik olarak aktarabilir. Bunu yapmak için, bir Launchpad projesi oluşturun, ardından yeni içe aktarma sayfasına gidin , Subversion öğesini seçin ve URL'yi girin (örn. http://projectname.googlecode.com/svn/trunk/). Proje boyutuna bağlı olarak, ilk içe aktarma birkaç saat sürebilir. Sonraki ithalatlar periyodik olarak yapılacaktır.

Daha fazla belge için bkz . Launchpad Yardımında VCS İçe Aktarmaları .


10

Google Code'dan GitHub'a senkronizasyon için bir rehber fnokd.com adresinde mevcuttur . Yazar, senkronizasyonu otomatikleştirmek için her zaman açık bir uzak sunucu ve bir cron işi kullanır ve SVN ana hattını "satıcı" adı verilen GitHub dalında tutar.



1

Hmm .. Şirketimde neredeyse aynısını yapıyordum. Aynı dizinde hem .svn hem de .git deposu bulundurmak (svn deposunu kontrol edersiniz ve bu çalışma kopyasında git deposu oluşturursunuz).

Sonra svn up ve git push kullanarak işi yaptı. Elbette, çok fazla farklılaşırsanız, nesneleri elle birleştirmeniz gerekecek.


Evet, doğru, ama .svn meta verisine sahip olmaktan kaçınmak istiyorum ve git'in aşağı akış yöneticisi olarak bir svn
deposu

Öyleyse depoyu kontrol etmek için git-svn ve github'a git itmek mümkün değil mi?
Marcin Gil

0

Ne istediğinizden tam olarak emin değilim ama tabii ki bir yıkım havuzundan alıp aynı çalışan kopyadan bir Git deposuna itebilirsiniz. Ayrıca git svn dcommityıkım havuzuna da geri dönebilirsiniz. Yine de GitHub deposunu subversion deposu ile senkronize edemezsiniz. Ayrıca, çalışma kopyanızda henüz subversion deposunda olmayan commit'leriniz olduğunda, subversion deposu güncellendiyse onları yeniden tabanlamanız gerekecek ve sizi GitHub'a git push --force“yeni” kayıtlara zorlayacaktır .


0

Yu-Jie Lin'in blogunda şu talimatları buldum :

Önce Subversion deposunu klonlayın ve Git'e gönderin:

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 deposuna kaydettikten sonra şunu çalıştırın:

cd /path/to/git-foo
git svn fetch 
git svn rebase 
git push git-foo master
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.