2013-02-13 34 views
9

是否有強大的方法來執行遞歸深度優先git submodule foreach命令?我使用foreach --recursive命令來完成這項工作,除了它是寬度優先。這是因爲如果我有以下結構的問題:git submodule foreach - 首先遞歸提交子模塊的可靠方法?

  • 一個
  • Ç

而且我有承諾在所有三個,一個foreach --recursive add -A && git commit ...將達到,B,C,如果我想讓supermodule捕獲當時B的提交,這是有問題的。

我從2008年發現了this discussion,但它看起來沒有任何建議的功能在我擁有的當前版本的Git(1.7.9.5)中。

我寫了一個小bash函數來做到這一點(原諒簡寫命名):

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

並用以下奇特的命令測試它似乎工作:

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

做這個命令似乎健壯,還是有其他常見的現有方法?

+0

注意:有些命令現在知道子模塊:例如'git grep -e「欄」--recurse-submodules「可用於Git 2.12:http://stackoverflow.com/a/41788645/6309 – VonC 2017-01-22 08:00:56

回答

3

我沒有發現任何其他方式比您的功能執行深度優先foreach命令。

該測試將檢查它是否確實實現了多於一個深度的遞歸。

A 
    B 
    D 
    C 

試圖把單引號(有點太爛不能夠給他們寫)的時候我一直有麻煩的你的和我的命令 - 多層次的bash的命令是逃逸有點混亂。

此(引號問題)應在GIT中被簡化1.9/2.0(Q1 2014),與commit 1c4fb13Anders Kaseorg (andersk)

'eval "[email protected]"' 創建殼解釋的額外層,這可能是不預計到誰傳遞多個參數與git子模塊的foreach用戶:

$ 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. 

要解決此問題,如果用戶傳遞多個參數,請直接執行「[email protected]」,而不是將它傳遞給eval

實例:

  • 引用添加一個額外的水平時典型用法是通過表示整個命令被傳遞到所述殼的單個參數。
    這不會改變這一點。
  • 可想而知有人饋送不可信的輸入作爲參數:
git submodule foreach git grep "$variable" 

即目前導致非顯而易見的殼代碼注入漏洞。
直接執行由參數命名的命令,如在此修補程序中修復它。

+0

我測試了mb14和我的技術,他們都似乎工作。我在pastebin上發佈了一個[示例](http://pastebin.com/eHeYiya7)。 – eacousineau 2013-02-13 21:07:38

10

你可以試試這個

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

這份名單(遞歸)所有的子模塊,然後反轉列表,tail -r讓你得到你想要的(孩子第一)的順序,進入目錄的目錄並做任何你想要的東西。

+0

有趣,比我的答案更完整。 +1 – VonC 2013-02-13 15:19:49

+0

礦應該適用於任何深度 – mb14 2013-02-13 15:35:53

+0

感謝您的支持!不幸的是,我沒有'-r'選項(Ubuntu),但通過[本文](http://stackoverflow.com/a/742485/170413),有'tac'命令。因此,用不同的xargs調味品,想出了另一種變體:'git submodule foreach --recursive | tac | sed's /進入//'| xargs -n 1 bash -c'cd $ 1 && git status'_' – eacousineau 2013-02-13 17:50:40