Harici bir repo alt modülünü kullanmak için bir git projesi nasıl kurulur?


213

Uzak bir depoyu çeken bir depo oluşturmak istiyorum.

Örneğin, bir alt modül olarak jQuery diyelim:

git://github.com/jquery/jquery.git

Bir alt modül olarak jQuery ile bir repo oluşturma ve uzak bir repo olarak kendi dışımı ekleme işlemi ne olurdu.

Ayrıca bu kurulum yapıldıktan sonra, kendi uzaktan kumandanıza iter / çekersem, harici sağlam kalır mı?


1
"İçeri çek" dediğinde jQuery repo'sunun kendi repo modelinin olmasını istediğini mi söylüyorsun?
ezod

Evet tam olarak, bu açık değilse özür dilerim. Kendi uzaktan kumandamdaki değişiklikleri iterek ve çekerken bunu harici olarak nasıl ayarladığımı bilmek istiyorum
Tom

Yanıtlar:


343
  1. Bir projeniz var - buna zaten bir github repo'su olan MyWebApp deyin
  2. Projenizde jquery deposunu kullanmak istiyorsunuz
  3. Jquery deposunu bir alt modül olarak projenize çekmek istiyorsunuz .

Alt modüllere başvurmak ve kullanmak gerçekten çok kolaydır. MyWebApp'in bir repo olarak ayarlandığını varsayarsak, terminal sorunundan şu komutları alın:

cd MyWebApp
git submodule add git://github.com/jquery/jquery.git externals/jquery

Bu, externals/jquery* adında bir dizin oluşturur ve bunu github jquery deposuna bağlar. Şimdi sadece alt modülü başlatmamız ve kodu klonlamamız gerekiyor:

git submodule update --init --recursive

Artık en son kodun alt modüle klonlanması gerekir. Jquery repo değişirse ve en son kodu aşağı çekmek istiyorsanız, submodule updatekomutu tekrar vermeniz yeterlidir . Lütfen dikkat: Projelerimde genellikle bir dizi harici havuz var, bu yüzden depoları her zaman bir "externals" dizini altında gruplandırıyorum.

Çevrimiçi Pro Git Book , okunması kolay bir şekilde sunulan alt modüller (ve genel olarak git) hakkında iyi bilgilere sahiptir. Alternatif olarak, git help submoduleiyi bilgiler de verecektir. Veya git wiki'deki Git Alt Modül Öğreticisine göz atın .

Alt modüllerden bahseden ve Subversion'un svn: externals mekanizmasına benzeyen bu blog girişini fark ettim: http://speirs.org/blog/2009/5/11/understanding-git-submodules.html

* En iyi uygulama olarak, alt modüllerinizi her zaman Haricilar gibi kendi dizinlerine yerleştirmelisiniz. Bunu yapmazsanız, kök proje dizininiz çok hızlı bir şekilde dağınık hale gelebilir.


4
Harika bir açıklama! Vb biraz daha ayrıntı, içsel uygulamalarını istiyorsanız :) Ayrıca "git yardım submodules" yardımcı olur
İstiyorsanız WhyNotHugo

2
Teşekkürler, tam olarak ihtiyacım olan şey.
MikeSchinkel

1
@Chevi Gereksinimlerinize bağlıdır. Genel olarak, bir projeyi bir alt modül olarak projenize eklemek, sık sık değişen veya halen geliştirilmekte olan projeler için iyi bir çözümdür. Bu, projenizdeki tüm 3. taraf kodlarının güncel olduğundan kolayca emin olmanızı sağlar. Temelde statik olan sabit bir üçüncü taraf kodu için, muhtemelen bir alt modülden sürümden sürüme çok fazla değişmeyecek olan olgun kod çok değer vermez.
hatıralar

2
Üzgünüm ama svn harici ile karşılaştırıldığında, o kadar kolay değil
Keil

2
@Keil İki komut git submodule addve git submodule update... Ne kadar kolay olabileceğinden emin değilim.
memmons

24

Bilmeniz gerekenlerin çoğu zaten cevaplandı, bu yüzden bunu ele almaya zahmet etmeyeceğim, ancak genellikle eksik olan küçük bir bilgi parçası buldum.

Bildiğiniz gibi, "git pull" alt modüllerini güncellemez ve "git submodules update" bu alt modüllerin en son HEAD'ını indirmez.

Tüm alt modüllerinizi en son yukarı akış revizyonuna güncellemek için şunu kullanabilirsiniz:

git submodule foreach git pull

Alt modüllerinizi sık sık değiştirirseniz ve çok sayıda varsa, "git foreach" paha biçilmez olacaktır.



0

@Hugo cevabının ihtiyacınız olan şey olabileceğini düşünüyorum ve iyi çalışıyor. Bu yüzden daha kolay bir yol buldum.

git submodule update --remote

Bu kadar.

Böylece tam bir iş akışı şunlar olabilir:

git clone project-with-submodules
git submodule init
git config -l
git submodule update --remote
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.