2013-02-13 11 views
9

git submodule foreach komutunu tekrarlayan derinlikli bir başlangıç ​​yapmak için sağlam bir yol var mı? İşi yapan foreach --recursive komutunu kullanıyorum, ilk önce genişliği.Git submodule foreach - Önce bir çocuk modülünü tekrar tekrar işlemek için sağlam bir yol?

  • A
    • B
  • C

Ve üçünde de taahhüt var, bir foreach --recursive add -A && git commit ... A vuracak: Bu aşağıdaki yapıya sahip çünkü eğer bir sorun , B, C, o zaman süpermodülün o zamanın B taahhütlerini ele geçirmesini istiyorsam sorunludur.

2008'den itibaren this discussion numaralı telefonu buldum, ancak önerilen özelliklerden herhangi birinin, mevcut olan Git sürümünde (1.7.9.5) bulunduğu görülmüyor. çalışmak

function git-sfed() { git submodule foreach "git submodule foreach '$*' && $*"; } 

Ve aşağıdaki hayali komutla onu test görünüyor:

git-sfed 'python -c "import sys; print sys.argv" $path' 

bu komut görünüyor mu

küçük bir bash bu (bahane stenografi adlandırmayı) yapmak fonksiyon yazdım sağlam mı yoksa başka mevcut yöntemler mi var?

+0

Not: Bazı komutlar artık alt modülden haberdardır: Örneğin, git grep -e "bar" --recurse-submodules "Git 2.12 ile kullanılabilir: http://stackoverflow.com/a/41788645/6309 – VonC

cevap

3

Önce foreach komutunu gerçekleştirmek için işlevinizden başka bir yol bulamadım.

Test, birden fazla derinlik için özyinelemeli olup olmadığını kontrol etmek olacaktır.

A 
    B 
    D 
    C 

(tür bunları yazmak mümkün değildir berbat) tek tırnak koymak için çalışırken sizin ve benim emriyle birlikte sorunumuz var zaten - çoklu seviyelerde olduğu bash komutları arasında olan kaçan biraz kafa karıştırıcı.

Bu (tırnak sorunu) Git'te basitleştirilmiş olmalıdır 1.9/2.0 (Q1 2014), commit 1c4fb13Anders Kaseorg (andersk) dan ile:

'eval "[email protected]"' değil muhtemelen kabuk yorumlama fazladan bir katman oluşturur

$ git grep "'" 
[searches for single quotes] 
$ git submodule foreach git grep "'" 
Entering '[submodule]' 
/usr/lib/git-core/git-submodule: 1: eval: Syntax error: Unterminated quoted string 
Stopping at '[submodule]'; script returned non-zero status. 
: submodule foreach git için birden fazla argüman geçen bir kullanıcı tarafından beklenenBunu düzeltmek için, kullanıcı birden fazla bağımsız değişken geçirirse, doğrudan eval'a geçirmek yerine " [email protected]" işlemini yürütün.

Örnekler: alıntı fazladan bir ekleme

  • tipik kullanım kabuğa geçirilecek tüm komut temsil eden tek bir bağımsız değişken geçmektir.
    Bu, bunu değiştirmez.
  • bir bağımsız değişken olarak güvenilir olmayan giriş besleme birisi hayal: henüz açık olmayan kabuk kod enjeksiyon açığı ile sonuçlanır
git submodule foreach git grep "$variable" 

.
Bağımsız değişkenler tarafından adlandırılan komutu doğrudan, bu düzeltme ekinde olduğu gibi uygular.

+0

Hem mb14'leri hem de tekniklerimi test ettim ve her ikisi de işe yaradı. Pastebin üzerinde bir [example] (http://pastebin.com/eHeYiya7) yayınladım. – eacousineau

10

Bu

git submodule foreach --recursive | tail -r | sed 's/Entering//' | xargs -I% cd % ; git add -A \& git commit 

Bu liste (yinelemeli) tüm alt modüller, ardından listeyi ters deneyebilirsiniz, tail -r böylece istediğiniz sırayla (çocuk ilk), dizin girmek dizinleri olsun ve içinde istediğin şeyi yap.

+0

Benimkinden daha ilginç, daha eksiksiz cevap. +1 – VonC

+0

mayın herhangi bir derinlik için çalışmalıdır – mb14

+0

Bunun için teşekkürler! Ne yazık ki, '-r' seçeneğim yoktu (Ubuntu), ama [bu yazı] aracılığıyla (http://stackoverflow.com/a/742485/170413) 'tac' komutu var. Yani farklı bir xargs çeşidi ile, başka bir varyant ile geldi: 'git submodule foreach --recursive | tac | sed 's/Giriş //' | xargs -n 1 bash -c 'cd $ 1 && git status' _' – eacousineau