Git-svn'e repo getirildikten sonra oluşturulan uzak bir daldan nasıl bahsederim?


193

Ben kullanıyorum git-svnşirketimin merkez Subversion arşivine karşı çalışmak. Son zamanlarda merkez repoda yeni bir özellik dalı oluşturduk.

Git'e bu konuyu nasıl anlatabilirim? Koştuğumda git branch -rsadece fetchGit depomu başlatmak için Subversion repo'yla karşılaştığımda var olan dalları görebiliyorum.


Buradan cevaplar: stackoverflow.com/questions/13376917/… da yararlı olabilir.
Tomasz Gandor

Yanıtlar:


294

Uzak dalı manuel olarak ekleyebilirsiniz,

git config --add svn-remote.newbranch.url https://svn/path_to_newbranch/
git config --add svn-remote.newbranch.fetch :refs/remotes/newbranch
git svn fetch newbranch [-r<rev>]
git checkout -b local-newbranch -t newbranch
git svn rebase newbranch

3
bu bağlantıyı dokümanlara referans olarak eklemek kernel.org/pub/software/scm/git/docs/git-svn.html
slf

1
.Git / config'ten uzak dalların tekli / çoklu depolardan nasıl yapılandırılabileceğini anlamak oldukça kolaydır.
Mikael Lepistö

6
Eğer bunu sekiz kez tekrar edebilirsem, yapardım. Son olarak, standart olmayan bir konuma eklenen bir svn dalı eklemenin bir yolu!
Tim Keating

7
Ben olsun fatal: Cannot setup tracking information; starting point 'newbranch' is not a branch.git ödeme adımında.
phpguru

17
@phpguru -t seçenek bayrağını 'git checkout -b local-newbranch newbranch' olacak şekilde kaldırmayı deneyin.
mj1531

96

TÜM uzak svn dallarını izlemek istiyorsanız, çözüm şu kadar basittir:

git svn fetch

Bu, henüz getirilmemiş TÜM uzak dalları getirecektir.

Ekstra ipucu: önce sadece bagajı kontrol ettiyseniz ve daha sonra TÜM dalları izlemek istiyorsanız, .git/configbu şekilde görünecek şekilde yeniden çalıştırın ve yeniden çalıştırın git svn fetch:

[svn-remote "svn"]
        url = https://svn/path_to_repo_root/
        fetch = path_to_trunk:refs/remotes/git-svn
        branches = path_to_branches/*:refs/remotes/*

Anahtar noktalar url, havuz kökünü göstermeli fetchve içinde tanımlanan ve branchesgöreli olan yollar olmalıdır url.

ALL yerine yalnızca belirli dalları almak istiyorsanız, bunun güzel bir örneği var git svn --help:

[svn-remote "huge-project"]
        url = http://server.org/svn
        fetch = trunk/src:refs/remotes/trunk
        branches = branches/{red,green}/src:refs/remotes/branches/*
        tags = tags/{1.0,2.0}/src:refs/remotes/tags/*

Eski sürümlerinde, git-svnbunun gibi şubeler belirledikten sonra, yeni şubeler alamayabilirsiniz git svn fetch. Geçici çözümlerden biri şuna fetchbenzer daha fazla satır eklemektir :

[svn-remote "huge-project"]
        url = http://server.org/svn
        fetch = trunk/src:refs/remotes/trunk
        fetch = branches/blue:refs/remotes/branches/blue
        fetch = branches/yellow:refs/remotes/branches/yellow
        branches = branches/{red,green}/src:refs/remotes/branches/*

@AndyEstes tarafından yapılan bir başka geçici çözüm: yeni belirtilen dallar veya etiketler oluşturulmadan önce veya düzeltmesinin .git/svn/.metadatadeğerini düzenleyin ve değiştirin . Bunu yaptıktan sonra , yeni svn uzak dalını takip etmek için çalıştırın .branches-maxRevtags-maxRevgit svn fetch


1
Bu ayarları ayarlamadan önce svn dallandırma işlemini gerçekleştiren düzeltmeyi zaten getirdiyseniz, git svn reset yapmak isteyebilirsiniz.
kcm1700

3
Düzenleme .git/svn/.metadataçok yardımcı oldu! Yaşıyorum benim, ekstra dalları ekleyerek oldu .git/config, git svn fetchmeta revizyon numarası "çok ileride" çünkü - on açmadı. Bir durumda, sadece bir şubeden son taahhüt alındı. El ile (adını hatalı şube kurtulunması .git/svn/refs/remotes/svn/qa/XYZiçin .git/svn/refs/remotes/svn/qa/XYZ~, içinde varlığını düştü .git/packed-refsvb) ... meta veriler için bir "erken" revizyon numarasını aldı ... ran git svn fetchnihayet w / doğru, bağlı grafiğin tam tarihini alır.
starlocke

8
BU KABUL EDİLMİŞ CEVAP OLMALIDIR! @janos, bana saatlerce baş ağrısı kurtardın! Hindistan'a gelirsen seni biraya çıkarırım!
Roopesh Shenoy

1
Veya: git svn fetch --all.
kenorb

1
Bu cevap şaşırtıcı, çünkü cevap bulamadığım 7 soruya cevap veriyor ve bunu 6 sayfalık bir anlatım yazmadan yapıyor.
Droj

53

Sadece ihtiyacım var gibi görünüyor git svn fetch; bir şekilde kendimi sadece değişiklikler yerine tüm repoyu getireceğine ikna etmiştim.


7
@mitjak Çözüm niçin doğru cevap değil? Yanıtın inceliğini anlamıyorum.
Mart'ta

'çözüm' belki 'çözüm' değildir
slf

1
@rholmes: Mitjak'ın sorunun çözümünün bu olduğu anlamına geldiğinden eminim, ancak sorduğunuz sorunun cevabı değil. (Çünkü yanlış soruyu sordunuz; o zaman sorunu yanlış yorumladığınız gibi.)
Mike Nelson

Bu, svn deposunu git'e klonladığınız anda şube bulunduğunda çalışır. Daha sonra svn deposundaki dal oluşturulduysa çalışmaz.
Petr Gladkikh

3
Şube klondan sonra oluşturulduğunda iyi çalışır, bunu her zaman yaparım.
Tim Gautier

15

Belki bir şekilde berbat ettim ama vjangus'un cevabındaki talimatları izledim ve neredeyse işe yaradı. Tek sorun, yeni dalın gövdeden dallanmış gibi görünmemesi idi. Gitk'te, kendi başına bir çeşit "yüzer" idi; gövde ile ortak bir atası yoktu.

Bunun çözümü şuydu:

  1. Şube oluşturulmadan önce bagajda gerçekleşen son taahhüdün SHA1'ini bulun.
  2. Yeni daldaki ilk taahhüdün SHA1'ini bulun (ileti büyük olasılıkla "Yeni şube oluşturuldu, trunk @ 12345'ten kopyalandı" veya başka bir şey)
  3. git diff-tree <sha1 from step 1> <sha1 from step 2>- çıktı olmamalıdır. Çıktı varsa, yanlış taahhütleri seçmiş olabilirsiniz.
  4. git checkout local-newbranchsonra git rebase <sha1 from step 1>. Bu local-newbranch, yeni ağaca yeniden bağlanır , ancak remotes/newbranchyine de bağlantısı kesilir.
  5. Dosyaya gidin .git/refs/remotes/newbranchve şu anda işaret ettiği eski komiteye karşılık gelen yeni komutun (rebased'de newbranch) tam SHA1'ini içerecek şekilde düzenleyin . (Ya da belki kullanın git-update-ref refs/remotes/newbranch <new-SHA>. Teşekkür ederim.)
  6. Bir dahaki sefere git svn dcommitkadar newbranch, bazı günlüğü güncellemekte bu konuda bir sürü mesaj alırsınız. Bence bu normal.

gitk --allYaptığınız işi takip etmek için sürekli açık kalmanızı ve sık sık yenilemenizi tavsiye ederim . Git ve git svn için hala yeni biriyim, bu yüzden lütfen bu yöntemde iyileştirmeler önerin.


2
Teşekkürler, bu kulağa faydalı geliyor. Yaklaşık 5. muhtemelen 'git-update-ref refs / remotes / newbranch <new-SHA>' daha güvenli seçenektir.
inger

Sadece vjangus'un yolunu tekrar denedim ve mükemmel çalıştı. Bunu yine de burada bırakacağım çünkü birileri için değerli olabilir ...
MatrixFrog

1
vjangus çözümü her zaman bagajdan ayrılan yeni dalı yaratır. Bunun SVN'nin gerçek içeriğin nasıl kopyalandığı hakkında hiçbir fikri olmadığı için olduğunu düşünüyorum.
bogdan.mustiata

Büyük bir git-svn repo ile yaşadığım deneyim, svn dallarının her zaman bagajdan ayrılan git'de oluşturulmuş olmasıdır. Onları birleştirmenin bir yolu olmalı, ama bunu çözmek için zaman ayırmadım. AFAIK, svn dalına bağlı git dalını yeniden oluşturamazsınız, çünkü bu dcommit mantığını bozar. Onunla yaşamayı öğrendik.
Spencer

7

Vjangus'un cevabının basitleştirilmesi:

SVN'de standart düzeni kullanıyorsanız ve her zamanki svn init'i yaptıysanız, git-svn sizin için yapılandırma işlerini yapacaktır. Sadece:

  1. SVN'de şube kopya düzeltmesini bulun
  2. Git-svn ile bu düzeltmeyi getir
  3. Yeni yerel şube izleme uzaktan kumandası oluşturma

Bir örnek. SVN URL'si svn+ssh://gil@svn.myplace.com/repo. Aradığım SVN şubesi newbranch. Yerel git şubesi (uzaktan izleme newbranch) olacak git-newbranch.

1.Adım: Şube kopyası revizyonunu bulun

    # svn günlüğü - kopyada durdur svn + ssh: //gil@svn.myplace.com/repo/branches/newbranch | kuyruk -4
    r7802 | birisi | 2014-03-21 18:54:58 +0000 (Cum, 21 Mar 2014) | 1 satır

    şube şube HEB yeni
    -------------------------------------------------- ----------------------

Yani SVN'deki dallanma noktası revizyon 7802'dir.

2. Adım: Düzeltmeyi getirin

    # git svn getir -r 7802
    Olası şube noktası bulundu: svn + ssh: //gil@svn.myplace.com/repo/trunk => svn + ssh: //gil@svn.myplace.com/repo/branches/newbranch, 7801
    Bulunan şube üst öğesi: (refs / uzaktan kumandalar / gövde) 8dcf3c5793ff1a8a79dc94d268c91c2bf388894a
    Takip eden ebeveyn do_switch ile
    Ebeveyn başarıyla takip edildi
    r7802 = 9bbd4194041675ca5c9c6f3917e05ca5654a8a1e (refs / uzaktan kumandalar / newbranch)

git-svn tüm işi yaptı ve şimdi uzaktan kumanda hakkında bilgi sahibi:

    # git show-ref | grep newbranch
    2df23af4733f36f5ad3c14cc1fa582ceeb3edb5c refs / uzaktan kumandalar / newbranch

3. Adım: Uzak olanı izleyerek yeni yerel şubenizi oluşturun:

    # git checkout -b git-newbranch -t newbranch
    Dosyaları teslim alma:% 100 (413/413), bitti.
    Şube git-newbranch yerel ref ref / uzaktan kumandalar / newbranch izlemek için kuruldu.
    Yeni bir şubeye geçildi 'git-newbranch'

Bunu takiben sonunda anlamama izin show-refverdim ( paha biçilemez)! Uzak dallara yanlış atıfta bulunan herkes için onları silebilirsiniz (bunu yapmak zorunda kaldım git branch -d newbranchve sonra ref yönünü kaldırmaya zorladım .git/svn/refs/remotes/newbranch) ve sonra 2. adımda (yukarıda) yeniden başlayabilirsiniz.
tutuDajuju

5

Bu özellik hakkında herhangi bir belge bulamadım, ancak git svn yapılandırması birden çok getirme girişini destekliyor gibi görünüyor. Bu şekilde, yapılandırmanıza başka bir uzak svn depo girişi eklemenize veya belirli bir dizinin tüm dallarını almak için joker karakterler kullanmanıza gerek kalmadan şubeleri ayrı ayrı ekleyebilirsiniz.

SVN ağacınızın, nasıl konumlandıklarına dair herhangi bir mantık olmadan çok sayıda dalı olması konusunda çok kötü olduğunu düşünün, örneğin, daha dallı şubeler ve alt dizinlere sahip olmak.

yani

trunk
branches
  -> branch1
  -> sub-dir1
    -> branch2
    -> branch3
  -> sub-dir2
    -> branch4
    -> sub-dir3
      -> branchX 
<... hundreds more ...>

ve sadece git deponuza dahil edilecek bazı şubeleri elden almak istersiniz.

İlk önce deponuzu ek şubesi olmayan sadece bagajla başlatabilirsiniz:

git svn clone -r 10000:HEAD https://svn.com/MyRepo myrepo --prefix=svn/ --trunk=trunk 

Bundan sonra aşağıdaki yapılandırmayı görmelisiniz:

localhost: elhigu$ git config --get-regexp "svn-remote."
svn-remote.svn.url https://svn.com/MyRepo
svn-remote.svn.fetch trunk:refs/remotes/svn/trunk

MyRepo'dan yeni bir şube almak istediğinizde yapılandırmaya şu şekilde yeni getirme girdileri ekleyebilirsiniz:

git config --add svn-remote.svn.fetch branches/sub-dir2/branch4:refs/remotes/svn/branches/sub-dir2/branch4

Veya aynı yapılandırmayı .git / config dosyasında düzenleyebilirsiniz.

Yeni dalları yapılandırmaya ekledikten sonra getirmek için şunu çalıştırın:

git svn fetch -r 10000:HEAD

[Düzenle] Bazen yeni eklenen dalları almak için --all parametresi ile getirmeyi çalıştırmak gerekebilir:

git svn fetch --all -r 10000:HEAD

4

Git-svn tuhaflıkları ile uğraşmak yerine SubGit'i deneyebilirsiniz .

Subvers'i Subversion deposuna kurmak gerekiyor. Bundan sonra özel git-svn komutları yerine standart git iş akışı kullanılabilir:

  1. Yeni taahhütleri zorlamak:

    Git-svn:

    $ git commit
    $ git svn rebase
    $ git svn dcommit
    

    SubGit:

    $ git commit
    $ git push
    
  2. Gelen değişiklikleri getirme

    Git-svn:

    $ git svn rebase
    

    SubGit:

    $ git pull [--rebase]
    
  3. Yeni bir şube oluşturma:

    Git-svn:

    $ git svn branch foo
    $ git checkout -b foo -t remotes/foo
    $ git commit
    $ git svn dcommit
    

    SubGit:

    $ git checkout -b foo
    $ git commit
    $ git push
    

Daha fazla ayrıntı için SubGit belgelerine bakın.


1
SubGit, bir svn ve bir "shadow" git deposu olmak üzere iki havuz oluşturmasının dezavantajına sahiptir. Bu büyük SVN depoları için bir sorun olabilir ...
Udo

@ Udo, SVN deposunda birkaç proje varsa, bunlardan yalnızca biri belirtilebilir ve Git deposu ile senkronize edilebilir. Bu durumda, tüm Subversion veri havuzunu Git'e dönüştürmeye gerek yoktur. Ancak eğer bu depoda büyük bir SVN projesi varsa, bu deponun tüm tarihini değil, bazı minimal revizyondan başlayarak tarihi dönüştürebilirsiniz. Bu, çevrilen Git deposunun boyutunu azaltmaya izin verir.
vadishev

1
@Udo - depo sunucusunu sabit disk satın almak istemeyen herhangi bir şirketin öncelikleri berbat durumda. Ancak büyük depoları olan çoğu yer depolarını oldukça ciddiye alır ve depolar için disk alanı gereksinimleri, onlarca yıllık geçmişi ve on milyonlarca kod satırı ve yüz binlerce düzeltme içeren şirketler için bile genellikle önemli bir sorun değildir. Şirketin ana fikri varlıklarının en somut şekli ve disk alanı oldukça ucuz. Bir RAID denetleyicisini yükseltme ihtiyacını tetikleyebilir, ancak yine de üretkenlik kazancı ...
Bob Kerns

@Bob Kerns - Mesele şu ki, "boyut bilge" SVN ve Git ve uyumlu değil. Bu bir disk depolama sorunu değil. Ancak büyük bir SVN deposu ile çalışabilirsiniz, çünkü genellikle sadece birkaç dosya / projeye göz atmanız gerekir. Ama büyük bir Git deposunu klonlayamazsınız - en azından eğlenceli değil ;-) "Büyük" ile birkaç konser demek istiyorum.
Udo

2

Bana yardımcı olan vjangus'un cevabına eklemek için, dalları uygun bir şekilde gövdeye bağlamak için git greftleri eklemeyi yararlı buldum - git'in tarihi görmesine ve doğru birleştirme yapmasına izin ver.

Bu, .git/info/graftskarmalarla bir satır eklemek için bir örnektir :

<initial branch commit> <parent commit in trunk>

Örneğin.

378b0ae0902f5c2d2ba230c429a47698810532e5 6c7144991381ce347d4e563e9912465700be0638

Kredi http://evan-tech.livejournal.com/255341.html

(Bunu bir yorum olarak eklerdim, ancak yeterli itibarım yok.)


0

Geçerli bir mizanpajla kontrol etmezseniz, uzak bir şubeyi kontrol edemezsiniz.

Bu benim işim:

git svn init -s <svn path with no trunk> local_repo
cd local_repo
git svn fetch 
## wait

Bundan sonra, uzak bir şubeye geçebilirsiniz:

git checkout --track -b branch_name branch_name

Ardından otomatik olarak şubenize yönlendirileceksiniz.

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.