Git-svn, bir Subversion deposundaki son n revizyonları nasıl kopyalar?


314

Sorun

Bir Subversion deposundan git-svn ile sığ bir kopyayı nasıl oluşturursunuz, örneğin yalnızca son üç düzeltmeyi nasıl çekersiniz?

git cloneSeçeneğini kullanırsanız komutu bir Git deposundan son n revizyonları alabilirsiniz --depth, depoya sığ bir kopyasını almak yani. Misal:

git clone --depth 3 git://some/repo myshallowcopyrepo

Git-svn için benzer bir seçenek var mı?

Şimdiye kadar yaptığım keşiflerim

Şimdiye kadar sadece revizyonun çekileceği -rNseçeneği buldum N. Misal:

git svn clone -rN svn://some/repo

Belgelere göre kullanım imkanı var -r$REVNUMBER:HEAD. Bir hata mesajı döndüren son 3 düzeltmeleri almak için aşağıdakileri denedim.

$ git svn clone --prefix=svn/ -s -rHEAD~3:HEAD http://some/svn/repo .
revision argument: HEAD~3:HEAD not understood by git-svn

Bu yüzden HEAD~3, üçüncü ama son revizyon 534'ün gerçek sayısı ile değiştirdim. Bu işe yaradı, ancak bu önce üçüncü ama son taahhüdün revizyon numarasını bulmamı gerektiriyor.

$ git svn clone --prefix=svn/ -s -r534:HEAD http://some/svn/repo .

belgeleme

Git-klon

Git-svn


6
Kendi sorumu -s is for --stdlayout which presumes the svn recommended layout for tags, trunk, and branches.
cevaplıyorum

Ne kadar zor uygulamak olacaktır --depthiçin git svndestek zaten olmadığından,. Ve zaten sunucudan en son devir bulmak zorunda?
Peter Cordes

Yanıtlar:


238

Git-SVN'de ( -r$REV:HEAD) klonunuzu başlatmak istediğiniz SVN revizyon numarasını belirterek sığ bir klon belirtmenin en basit yolunu zaten keşfettiniz .

Örneğin: git svn clone -s -r1450:HEAD some/svn/repo

Git'in veri yapısı, yönlendirilmiş bir döngüsel grafikteki (DAG) işaretleyicilere dayanır ve bu da geri adım natmayı önemsiz kılar . Ancak SVN'de (ve dolayısıyla Git-SVN'de) düzeltme numarasını kendiniz bulmanız gerekecektir.


5
gelecekte daha önceki revizyonu klonlamaya devam etmek istersem, bu mümkün mü?
Zennichimaro

5
@Zennichimaro: Bunu git-svn, aynı yere başka bir uzaktan işaret ekleyerek ve git-svn fetchdaha fazla ağaç almak için kullanarak yapabilirsiniz . Bu noktada git filter-branch, eski (kısmi) ağacı sağ dalda yeniden teçhiz etmek için kullanmanız gerekir.
Ben Jackson

Paul, SVN'den Git'e Artan Geçiş yaparak en son revizyonları almamın bir yolu var ( stackoverflow.com/questions/29161646/… )
SabareeshSS

1
SVN, revizyonları tanımlamak için ardışık tamsayılar kullanır ve geri n
dönüşleri

Ben -r sonra eksik bir boşluk olduğunu düşünüyorum. Örneğin git svn clone -r 1133: HEAD some / svn / repo
Gnana

92

Kendimi devasa yıkım ağacımızdan sınırlı sayıda revizyon almak için sık sık aşağıdakileri kullandığımı görüyorum (yakında svn revizyonu 35000'e ulaşıyoruz).

# checkout a specific revision
git svn clone -r N svn://some/repo/branch/some-branch
# enter it and get all commits since revision 'N'
cd some-branch
git svn rebase

Ve bir dalın nereden başladığını bulmanın iyi bir yolu, bir dal yapmak svn logve daldaki ilkini bulmaktır (bunu yaparken sonuncusu listelenir):

svn log --stop-on-copy svn://some/repo/branch/some-branch

Şimdiye kadar tüm şubeleri takip etmede gerçekten güçlük bulamadım. Klonlamak için çok fazla zaman alıyor ve svn ve git birlikte istediğim kadar iyi çalışmıyor. Yama dosyaları oluşturma ve bunları başka bir svn dalının git klonuna uygulama eğilimindeyim.


1
+ 1 benden - bir hata 128 yuvarlak sorunu almak bana yardımcı oldu Tüm bir svn repo klonlama oldu
Ian Oxley

svn log komutu tam olarak aradığım şeydi! teşekkürler
mrbrdo

1
Birlikte çalıştığım depolar standart dışı dallanma ve düzene sahip, bu yüzden genellikle her bir SVN dalı için yerel bir Git deposu oluşturuyorum ve sonra cherry-pick/ rebasearasında. Taahhüt fazladan bir adım atıyor ( pushve sonra dcommituzak repodan), ama bunun ödünleşmeye değer olduğunu düşünüyorum.
chronospoon

Bunu düşünmemiştim, dediğin gibi sadece belirli etiketleri / dalları klonlamak daha hızlı olabilir :)
VeenarM

34

... 7 yıl sonra, çölde, bir tumbleweed ...

Kabul edilen cevaptan memnun kalmadım, bu yüzden Github'da sizin için bunu yapmak için bazı komut dosyaları oluşturdum . Bunlar, kullanmak isteyen git svn cloneancak tüm depoyu klonlamak istemeyen ve tarihin ortasından klonlamak için belirli bir revizyon için avlanmak istemeyen herkese yardımcı olmalıdır (belki bir demet depoyu klonluyorsunuzdur). Burada sadece son N revizyonunu klonlayabiliriz:

git svn cloneSon 50 düzeltmeyi klonlamak için kullanın

# -u    The SVN URL to clone
# -l    The limit of revisions
# -o    The output directory

./git-svn-cloneback.sh -u https://server/project/trunk -l 50 -o myproj --authors-file=svn-authors.txt

Bir SVN deposundan önceki N revizyonunu bulma

# -u    The SVN URL to clone
# -l    The limit of revisions

./svn-lookback.sh -u https://server/project/trunk -l 5     

Bu bir çatlak verecek, repo yaklaşık 170.000 revizyon var ve tek bir proje yapmak için çok uzun sürüyor ve ben repo yapmak için 10'dan fazla belirli projeleri var: | Sadece 3-4 yıllık bir tarih yapmayı düşünürsek.
VeenarM

1
Bunu paylaştığın için teşekkürler!
Kai Mechel
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.