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 submodule
şimdi taklit edebilir svn:external
(Mart 2013'ten beri).
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 submodule
şimdi taklit edebilir svn:external
(Mart 2013'ten beri).
Yanıtlar:
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.
svn:externals
. Düzeltme 1.5 ile sözdizimi daha esnek bir biçime dönüştürüldü. Eklenen, göreli URL adreslemesiydi.
" 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 submodule
en 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 .
svn:externals
?
--depth
ama problemi gerçekten ele almıyor.
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:
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 .
gil
.