Bu tartışmada iki farklı senaryo karıştırılıyor gibi görünüyor:
Senaryo 1
Ana veri havuzumun alt modüllere işaret eden işaretlerini kullanarak, her alt modülde üst veri havuzunun işaret ettiği taahhüdü kontrol etmek istiyorum, muhtemelen ilk önce tüm alt modüllerden yineleme yaptıktan ve bunları uzaktan güncelleme / çekme işleminden sonra.
Bu, belirtildiği gibi,
git submodule foreach git pull origin BRANCH
git submodule update
OP'nin amaçladığı şey olduğunu düşünüyorum Senaryo 2
Bir veya daha fazla alt modülde yeni şeyler oldu ve 1) bu değişiklikleri çekmek ve 2) ana depoyu bu / bu alt modüllerin HEAD (en son) taahhüdüne işaret edecek şekilde güncellemek istiyorum.
Bu,
git submodule foreach git pull origin BRANCH
git add module_1_name
git add module_2_name
......
git add module_n_name
git push origin BRANCH
Çok pratik değil, çünkü üst havuzun taahhüt işaretlerini güncellemek için örneğin bir komut dosyasındaki tüm n alt modüllerine n yollarını sabitlemek zorunda kalacaksınız.
Ana modül işaretçisini (kullanarak git add
) alt modülün başına işaret edecek şekilde güncelleyerek, her alt modül boyunca otomatik bir yinelemeye sahip olmak güzel olurdu .
Bunun için bu küçük Bash senaryosunu yaptım:
git-update-submodules.sh
#!/bin/bash
APP_PATH=$1
shift
if [ -z $APP_PATH ]; then
echo "Missing 1st argument: should be path to folder of a git repo";
exit 1;
fi
BRANCH=$1
shift
if [ -z $BRANCH ]; then
echo "Missing 2nd argument (branch name)";
exit 1;
fi
echo "Working in: $APP_PATH"
cd $APP_PATH
git checkout $BRANCH && git pull --ff origin $BRANCH
git submodule sync
git submodule init
git submodule update
git submodule foreach "(git checkout $BRANCH && git pull --ff origin $BRANCH && git push origin $BRANCH) || true"
for i in $(git submodule foreach --quiet 'echo $path')
do
echo "Adding $i to root repo"
git add "$i"
done
git commit -m "Updated $BRANCH branch of deployment repo to point to latest head of submodules"
git push origin $BRANCH
Çalıştırmak için,
git-update-submodules.sh /path/to/base/repo BRANCH_NAME
ayrıntı
Her şeyden önce, $ BRANCH (ikinci argüman) adlı şubenin tüm depolarda bulunduğunu varsayıyorum. Bunu daha da karmaşık hale getirmek için çekinmeyin.
İlk birkaç bölüm, argümanların orada olup olmadığını kontrol etmektir. Sonra üst veri havuzunun en son şeylerini çekiyorum (sadece çekiş yaptığımda --ff (hızlı yönlendirme) kullanmayı tercih ediyorum. Rebase off, BTW).
git checkout $BRANCH && git pull --ff origin $BRANCH
Daha sonra, yeni alt modüller eklenmişse veya henüz başlatılmamışsa bazı alt modüllerin başlatılması gerekebilir:
git submodule sync
git submodule init
git submodule update
Sonra tüm alt modülleri güncellerim / çekerim:
git submodule foreach "(git checkout $BRANCH && git pull --ff origin $BRANCH && git push origin $BRANCH) || true"
Birkaç şey dikkat edin: Her şeyden önce, bazı Git komutlarını kullanarak zincirleme yapıyorum &&
- yani önceki komut hatasız yürütülmelidir.
Olası başarılı bir çekimden sonra (uzaktan kumandada yeni şeyler bulunursa), istemcide olası bir birleştirme işleminin geride kalmamasını sağlamak için bir itme yaparım. Yine, sadece olur eğer bir çekme aslında yeni şeyler getirdi.
Son olarak, son || true
komut dosyasının hatalar üzerinde devam etmesini sağlamaktır. Bunu yapmak için, yinelemedeki her şey çift tırnak içine alınmalı ve Git komutları parantez içine alınmalıdır (operatör önceliği).
En sevdiğim kısım:
for i in $(git submodule foreach --quiet 'echo $path')
do
echo "Adding $i to root repo"
git add "$i"
done
--quiet
'MODULE_PATH Girme' çıkışını kaldıran tüm alt modülleri yineleyin. Kullanılması 'echo $path'
(tek tırnak içinde olmalıdır), alt modülün yolu çıkışına yazılı alır.
Bu göreli alt modül yolları listesi bir dizide ( $(...)
) yakalanır - son olarak bunu yineleyin ve git add $i
üst veri havuzunu güncellemek için yapın.
Son olarak, üst havuzun güncellendiğini açıklayan bazı mesajlar içeren bir taahhüt. Hiçbir şey yapılmadıysa, bu işlem varsayılan olarak yok sayılır. Bunu başlangıç noktasına itin ve işiniz bitti.
Daha sonra bir zamanlanmış otomatik dağıtım zincirleri bir Jenkins işinde çalışan bir komut dosyası var ve bir cazibe gibi çalışır.
Umarım bu birisine yardımcı olur.
--remote
seçeneği ile ihtiyacınız olan işlevselliğe sahip olduğuna göre , belki de bunu Jason'ın cevabındaki "elle" yaklaşımı yerine kabul edilen cevap olarak işaretlemek yararlı olacaktır?