Bir alt dizine alt modülü nasıl eklerim?


310

~/.janus/İçinde bir sürü submodül içeren bir git repo var. Ben de alt modülü eklemek istiyorum ~/.janus/snipmate-snippets/snippets/ama çalıştırdığınızda git submodule add <git@github.com:...>içinde snipmate-snippetsdizinde, ben şu hata mesajı alıyorum:

You need to run this command from the toplevel of the working tree.

Yani soru şu: snipmate-snippetsDizine nasıl bir alt modül eklerim ?


Alt modül komutları için git repo kök dizinine gitmek artık gerekmeyecek (yakında). Aşağıdaki cevabımı
VonC

3
git submodule add -b <branch> <url> <relative_path_4m_root>
parasrish

Yanıtlar:


438

İçeri girip ~/.januskaçıyorsunuz:

git submodule add <git@github ...> snipmate-snippets/snippets/

Alt modüller (veya genel olarak git) hakkında daha fazla bilgiye ihtiyacınız varsa ProGit oldukça kullanışlıdır.


HEAD kolayca ayrılırken şube eklemek iyi bir fikir gibi görünüyor: git submodule add -b <branch> <repository> [<submodule-path>]
deann

1
Benim için bu neden oldu 'subprojects' already exists in the index (dizin adı olarak alt projeleri kullanıyordum) . Bunun yerine, yardımcı olan şey, VonC'nin aşağıdaki cevabıdır, yani yapıyor cd subprojectsve sonra git submodule add <get@github …>yolsuz.
Hi-Angel

83

Git1.8.4'ü (Temmuz 2013) başlattığınızda , artık kök dizine geri dönmek zorunda kalmayacağınızı unutmayın.

 cd ~/.janus/snipmate-snippets
 git submodule add <git@github ...> snippets

( Bouke Versteegh comments kullanmak zorunda kalmamasıdır /.olduğu gibi snippets/.: snippetsyeter)

Bkz. Taahhüt 091a6eb0feed820a43663ca63dc2bc0bb247bbae :

alt modül: üst seviye gereksinimi bırakın

rev-parse --prefixAlt modül komutuna verilen tüm yolları işlemek ve deponun en üst düzeyinden çalıştırılması gereksinimini bırakarak yeni seçeneği kullanın .

Göreli bir alt modül URL'sinin yorumu " remote.origin.url" yapılandırılıp yapılandırılmadığına bağlı git submodule addolduğundan, çalışma ağacının en üst düzeyinde olmadığında " " içindeki göreli URL'leri açıkça engelleyin .

İmzalayan: John Keeping

Belirlenir Bağımlılığı 12b9d32790b40bf3ea49134095619700191abf1f işlemek

Bu, yazdırılan tüm dosya yollarının, çalışma ağacının üst kısmından tam yolla öneki olmasıgit rev-parse farkıyla, bir deponun belirtilen alt dizininden çağrılmış gibi davranır .

Bu, cdçalışma ağacının en üstüne çıkmak isteyebileceğimiz ancak kullanıcı tarafından komut satırında verilen göreli yolları işlememiz gereken kabuk komut dosyaları için kullanışlıdır .


Çok teşekkürler! Firar /.gerekli olmadığını fark ettim , git onsuz dizin parçacıkları oluşturacaktır.
Bouke Versteegh

@BoukeVersteegh İlginç. Daha fazla görünürlük için yorumunuzu cevaba ekledim.
VonC

Git sürüm 2.7.4 üzerinde ama yine de bu hata iletisini alıyorum Relative path can only be used from the toplevel of the working tree. Ben yapıyorumgit submodule add ../../../functest
FlyingAura

@ user3426358 evet, bu bekleniyor: sadece kök klasöründen değil, ana depodaki herhangi bir alt klasörden bir git submoduel ekleme yeteneği hakkında os'ın üzerindeki cevap. Bu, alt modül uzak repo'yu göreceli bir yolla referanslamakla ilgili değildir . Bunu yaparsanız, gördüğünüz hata mesajını alırsınız.
VonC

@ user3426358 Ve bu arada, bu hata mesajı (gördüğünüz: " Relative path can only be used from the toplevel of the working tree')' dir değil (asıl soruya itibaren bir' You need to run this command from the toplevel of the working tree")
VonC

17

Benzer bir sorunum vardı, ama kendimi GUI araçlarıyla köşeye sıkıştırmıştım.

İçinde birkaç dosya ile bir alt proje vardı, ben şimdiye kadar sadece kendi git repo kontrol yerine etrafında kopyalanmış vardı. Ben alt klasörde bir repo yarattı, taahhüt, itme, vb gayet iyi başardı. Ancak ana depoda alt klasör bir alt modül olarak ele alınmadı ve dosyaları ana kopya tarafından hala izleniyordu - iyi değil.

Bu karışıklıktan kurtulmak için Git'e alt klasörü izlemeyi bırakmasını söylemeliydim (dosyaları silmeden):

proj> git rm -r --cached ./ui/jslib

Sonra orada bir alt modül olduğunu söylemek zorunda kaldım (şu anda git tarafından izlenen bir şey varsa yapamazsınız):

proj> git submodule add ./ui/jslib

Güncelleme

Bunu ele almanın ideal yolu birkaç adım daha içerir. İdeal olarak, mevcut repo kendi dizinine taşınır, herhangi bir üst git modülü içermez, işlenir ve aktarılır ve ardından aşağıdaki gibi bir alt modül olarak eklenir:

proj> git submodule add git@bitbucket.org:user/jslib.git ui/jslib

Bu, git repo'yu bir alt modül olarak klonlayacaktır - bu, standart klonlama adımlarını içerir, aynı zamanda git'in sizin için bu alt modülün çalışmasını sağlamak için aldığı diğer daha belirsiz yapılandırma adımlarını da içerir. En önemli fark, gerçek git dir'nin yaşadığı yere bir yol referansı içeren bir .git dizini yerine basit bir .git dosyası yerleştirmesidir - genellikle üst proje kökü .git / modules / jslib'de.

Bir şeyleri bu şekilde yapmazsanız, sizin için iyi çalışırlar, ancak ebeveyninizi taahhüt edip ittikten hemen sonra ve başka bir geliştirici bu ebeveyni çekmeye başlarsa, hayatlarını çok daha zorlaştırdınız. Kendi .git dizinini içeren bir dizin alt klasöründe tam bir .git dizininiz olduğu sürece, makinenizdeki yapıyı çoğaltmaları çok zor olacaktır.

Yani, taşımak, itmek, git add submodule, en temiz seçenektir.


16

Yapılandırma dosyalarını elle düzenleme konusundaki garip sevgimi paylaşanlar için aşağıdakileri eklemek (veya değiştirmek) de işe yarayacaktır.

.git / config (kişisel yapılandırma)

[submodule "cookbooks/apt"]
    url = https://github.com/opscode-cookbooks/apt

.gitmodules (taahhütlü paylaşılan yapılandırma)

[submodule "cookbooks/apt"]
    path = cookbooks/apt
    url = https://github.com/opscode-cookbooks/apt

Buna da bakın - .gitmodules ve .git / config içindeki alt modülleri belirleme arasındaki fark?


2

.vim scriptlerim için Vundle güncellemelerini kullanarak kendimi bir köşede boyadığım için Chris'in yukarıdaki cevabına yardımcı olmak için tek satırlı bir bash betiği. DESTalt modüllerinizi içeren dizinin yoludur. Bunu yaptıktan sonra yapgit rm -r $DEST

DEST='path'; for file in `ls ${DEST}`; do git submodule add `grep url ${DEST}/${file}/.git/config|awk -F= '{print $2}'` ${DEST}/${file}; done

şerefe

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.