SVN: Git'te dışsal eşdeğer mi?


177

Svn: externals kullanarak başka bir SVN deposundan kullanılan iki SVN projem var .

Git'te aynı depo düzeni yapısına nasıl sahip olabilirim?


Git alt modüllerine bakmalısınız . Neredeyse tam olarak aradığınıza izin vermelidir.
foxxtrot

7
Son 4 yılda buna yeni bir cevap var mı, yoksa git dünyası bugün aynı mı?
DougW

4
@ DooW Evet, aşağıda yeni bir cevabım var : git submoduleşimdi taklit edebilir svn:external(Mart 2013'ten beri).
VonC

Git'in en son sürümü için resmi Git belgelerinde Git alt modüllerini okumanızı öneririm .
Bulki S Maslom

Yanıtlar:


134

Git'in svn: externals öğesine benzeyen ancak tam olarak eşdeğer olmayan iki yaklaşımı vardır:

  • Alt ağaç birleştirmeleri dış projenin kodunu deponuzdaki ayrı bir alt dizine ekler. Bu, ayrıntılı bir işlem sürecine sahiptir ve daha sonra diğer kullanıcılar için çok kolaydır, çünkü depo teslim edildiğinde veya klonlandığında otomatik olarak dahil edilir. Bu, projenize bir bağımlılık eklemek için uygun bir yol olabilir.
    Diğer projeden değişiklikleri almak kolaydır, ancak değişiklikleri geri göndermek karmaşıktır. Ve diğer proje kodunuzdan birleşmek zorundaysa, proje geçmişleri birleştirilir ve iki proje etkili bir şekilde bir olur.

  • Git submodules ( manual ), svn: externals gibi, başka bir projenin veri havuzundaki belirli bir işleme bağlanır-r. Alt modüllerin kurulumu kolaydır, ancak tüm kullanıcıların otomatik olarak kasalara (veya klonlara) dahil olmayan alt modülleri yönetmesi gerekir.
    Değişiklikleri diğer projeye geri göndermek kolay olsa da, repo değiştiyse bunu yapmak sorunlara neden olabilir. Bu nedenle, aktif olarak geliştirilmekte olan bir projeye değişiklikleri geri göndermek genellikle uygun değildir.


17
Bilginize, şimdi svn: externals ile spesifik revizyonlar belirtmek mümkün (şimdi 1.5 veya 1.6'dan beri inanıyorum?)
Nate Parsons

9
FYI, git alt modülleri otomatik olarak yönetilebilir ve uygulanabilir. git, tıpkı .gitignore dosyası gibi işlenebilen / işlemesi gereken bir .gitmodules dosyası oluşturur. Daha fazla bilgi için [ git-scm.com/book/tr/Git-Tools-Submodules] sayfasına bakın .
mikijov

5
@NateParsons Tam revizyon numaralarını ile belirlemek her zaman mümkün olmuştur svn:externals. Düzeltme 1.5 ile sözdizimi daha esnek bir biçime dönüştürüldü. Eklenen, göreli URL adreslemesiydi.
David

@NateParsons ancak git alt modülleri ile revizyonları atlamak mümkün mü ...> _>
Trejkaz

Ben svn: externals gibi tek dosyaları alt modül gitmek mümkün olmadığını düşünüyorum
user1911091

38

" Git alt modül yeni sürüm güncellemesinde " bahsettiğim gibi , Git 1.8.2 alt modülleriyle aynı SVN harici özelliğini elde edebilirsiniz :

git config -f .gitmodules submodule.<path>.branch <branch>

Bu, bir alt modülün bir dalı izlemesi için yeterlidir (bir alt modül yukarı akış deposunun uzak bir dalının EN SON işleminde olduğu gibi ). Tek yapmanız gereken:

git submodule update --remote

Bu alt modülü güncelleyecektir.

Daha fazla ayrıntı " git submoduleen son izlemede ".

Mevcut bir alt modülü bir izleme dalına dönüştürmek için : " Git alt modülleri: Bir dal / etiket belirtin " bölümündeki tüm adımlara bakın .


Kısmi ödeme yapabilir misiniz svn:externals?
nowox

Evet @nowox, sen seyrek ödeme olabilir (git 1.7+ stackoverflow.com/a/2372044/6309 ) (submodules ilişkili stackoverflow.com/a/17693008/6309 )
VonC

ne yazık ki tüm seyrek ödeme ile ilgili cevaplar asla bir örnek vermez :( Bunun için bir Gist örneği yazmaya çalışacağım ...
nowox

Bununla ilgili hala bir sorun var. Hala sadece küçük bir parçaya ihtiyacınız olan bir havuzun tüm geçmişini almanız gerekir. Benim durumumda 2GB üzerinden 100kB. Tabii ki kullanabilirim --depthama problemi gerçekten ele almıyor.
nowox

@nowox En iyisi, kullanım durumunuzun tam olarak ne olduğunu açıklayan yeni bir soru sormaktır: 2GB deponuzun bir alt modül mü yoksa alt modüllü bir ana repo olup olmadığını ve tam olarak ne çıkarmanız gerektiğini bilmiyorum.
VonC

3

Ben gil (git links) tool yazarıyım

Sorun için alternatif bir çözüm var - gil (git links) aracı

Karmaşık git depo bağımlılıklarının tanımlanmasını ve yönetilmesini sağlar.

Ayrıca git özyinelemeli alt modüllere bağımlılık sorununa bir çözüm sağlar .

Aşağıdaki proje bağımlılıklarına sahip olduğunuzu düşünün: sample git repository bağımlılık grafiği

Daha sonra .gitlinks, depolarla ilişki açıklaması içeren bir dosya tanımlayabilirsiniz:

# Projects
CppBenchmark CppBenchmark https://github.com/chronoxor/CppBenchmark.git master
CppCommon CppCommon https://github.com/chronoxor/CppCommon.git master
CppLogging CppLogging https://github.com/chronoxor/CppLogging.git master

# Modules
Catch2 modules/Catch2 https://github.com/catchorg/Catch2.git master
cpp-optparse modules/cpp-optparse https://github.com/weisslj/cpp-optparse.git master
fmt modules/fmt https://github.com/fmtlib/fmt.git master
HdrHistogram modules/HdrHistogram https://github.com/HdrHistogram/HdrHistogram_c.git master
zlib modules/zlib https://github.com/madler/zlib.git master

# Scripts
build scripts/build https://github.com/chronoxor/CppBuildScripts.git master
cmake scripts/cmake https://github.com/chronoxor/CppCMakeScripts.git master

Her satır git bağlantısını aşağıdaki biçimde tanımlar:

  1. Deponun benzersiz adı
  2. Deponun göreli yolu (.gitlinks dosyasının yolundan başlar)
  3. Git klon komutunda kullanılacak Git deposu Ödeme için depo dalı
  4. Boş satır veya # ile başlayan satır ayrıştırılmaz (yorum olarak değerlendirilir).

Son olarak kök örnek deponuzu güncellemeniz gerekir:

# Clone and link all git links dependencies from .gitlinks file
gil clone
gil link

# The same result with a single command
gil update

Sonuç olarak, gerekli tüm projeleri klonlayacak ve bunları uygun bir şekilde birbirine bağlayacaksınız.

Çocuk deposundaki tüm depolardaki bazı değişikliklerle bazı depodaki tüm değişiklikleri uygulamak istiyorsanız, bunu tek bir komutla yapabilirsiniz:

gil commit -a -m "Some big update"

Çekme, itme komutları benzer şekilde çalışır:

gil pull
gil push

Gil (git links) aracı aşağıdaki komutları destekler:

usage: gil command arguments
Supported commands:
    help - show this help
    context - command will show the current git link context of the current directory
    clone - clone all repositories that are missed in the current context
    link - link all repositories that are missed in the current context
    update - clone and link in a single operation
    pull - pull all repositories in the current directory
    push - push all repositories in the current directory
    commit - commit all repositories in the current directory

Git özyinelemeli alt modüller bağımlılık sorunu hakkında daha fazla bilgi .


1
Yazının başına yazar olduğunuzu söyleyerek bir sorumluluk reddi beyanı koymalısınız gil.
Daniel Kamil Kozar
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.