簡體   English   中英

git grep主要倉庫和特定子模塊

[英]git grep main repo and specific submodules

我在主存儲庫中有兩個子模塊,它們與主存儲庫中的代碼緊密耦合。 如此之多,以至於在執行git grep時,我希望將主倉庫與這兩個特定的子模塊一起grep。 我無法為每個“ git grep ... || true”做一個完整的git子模塊,因為我還有其他很大的子模塊,而通過這些子模塊進行grepping可能需要15至20秒的時間。

因此,我需要一個比git子模塊foreach更具體的解決方案,該解決方案允許我指定要grep的特定子模塊,以及grep我的主倉庫。

我的兩個子模塊是foosubmodules/bar

這是我目前的解決方案。 這使我可以說git gpx -i something.*interesting等。我仍然在創建git別名方面還很git gpx -i something.*interesting ,所以我希望可以改進此解決方案。

[alias]
    inr = "!f() { cd $1 && $2 ;}; f"
    gprs = "!f() { for r in $1; do git inr $r \"git grep $2\" | perl -pe \"s|^|$r/|\"; done ;}; f"
    gpx = "!f() { git grep $*; git gprs 'foo submodules/bar' \"$*\" ;}; f"

編輯:我發現的一個問題是我丟失了正則表達式周圍的引號,因此我無法調用這樣的名稱: git gpx -i "foo bar" ,因為它被翻譯為: git grep -i foo bar 我想不出一種避免這種情況的干凈方法。

重做 :我用那個腳本破解了一個bash腳本,以進行分頁(在底部提到),但是注意到您的示例已經在搜索路徑前加了前綴。 我對您的別名做了一些修改,現在發現它對我有用:

[alias]
    gpx = "!f() { list=$1; shift; for r in . $list; do ( cd $r; git grep $@ | perl -pe \"s|^|$r/|\"; ); done ;}; f"

如果您使用子外殼,則可以折疊“ inr”功能“((cd $ 1; cmd; ...)”(因為它隔離了chdir),並且可以添加“。”。 然后它將搜索超級模塊。 我用類似的東西測試了它

git --no-pager gpx 'foo submodules/bar' --color=always -nIE '\w+\(\w*\)' | less -R

它似乎可以很好地進行轉義(將使用git-rev-parse --sq-quote但好像git已經為您處理了)。 這似乎比下面列出的腳本更為優雅,也許我可以將您的別名樣式與功能前綴一起使用,並替換/簡化許多該功能。 話雖這么說,謝謝你的表現!

嘗試制作另一個別名,該別名使用gpx用作傳呼程序,但是轉義時有點gpx ,所以我也制作了另一個別名:

[alias]
   gpxp = "!f() { list=$1; shift; for r in . $list; do ( cd $r; git --no-pager grep --color=always $@ | perl -pe \"s|^|$r/|\"; ); done | less -R ;}; f"

然后變成

git gpxp 'foo submodules/bar' -nIE '\w+\(\w*\)'

注意 :如果出現錯誤,這些錯誤將顯示在grep文本結果中。

原文

我在轉義和使用git別名時遇到了類似的問題

我一直在為git-submodule寫一個小的擴展,它允許您進行約束迭代。 該功能的幫助位於git-submodule-ext foreach [-c | --constrain] git-submodule-ext foreach [-c | --constrain]幫助實現 )。 安裝說明在這里: 自述文件

如果您希望將迭代限制為foosomething/bar ,則可以在超級模塊中執行

git config scm.focusGroup 'foo something/bar'

然后做你的greppage

git --no-pager submodule-ext foreach -t -r -c -k git grep 'expression'

或者,如果您使用別名進行安裝,

git --no-pager tsfer -c -k git grep 'expression'

git --no-pager選項是為了防止每個子模塊在每次搜索后拉出$GIT_PAGER 我在腳本中添加了--keep-going選項,因此,如果grep不返回任何內容(導致非零狀態),則它不會停止迭代。 另一個解決方案是在子模塊docs中使用git tsfer -c -k 'git grep "expression" || :'進行示例。 git tsfer -c -k 'git grep "expression" || :' ,它們等效地工作。

如果您的表達式很復雜,則類似於尋找函數調用'\\w+\\(\\w*\\)' ,則需要將整個表達式括在雙引號中:

git --no-pager tsferp -c -k "git grep -E '\w+\(\w*\)'"

如果轉義是一個大問題,並且您正在使用bash,則導出要在迭代中使用的函數(我修改的擴展腳本使用bash ,而不是Git的標准/bin/sh

greppage() {
    git grep -E 'some(really)?complex.*\(expression\)'
}
export -f greppage
git --no-pager tsfer -c -k greppage

希望能有所幫助。

注意:此操作的當前缺點是,可能很難弄清楚匹配項位於哪個子模塊中。可以通過以某種方式在子模塊的$name前面添加一個修復程序,但是我查看了git grep的選項,並且可以找不到那樣的東西。 我稍微修改了一下命令,並提出了這個命令,“緊湊”命令:

git --no-pager sube -q foreach -t -r -c -k "echo [ \$name ]'\n'; git grep --color=always -E '\w+\(\w*\)'; echo '\n\n'" | less -R

這使foreach變得安靜(禁止“ Entering”輸出),並添加了大括號和換行符,以使查看子模塊之間的划分更加容易。 讓我看看是否可以為此創建函數/別名以使其更容易。

編輯 :這是被黑在一起的腳本,不是那么優雅。 我只是將其簡化為bash函數

git-greps() { git --no-pager sube -q foreach -t -r -c -k "git grep --color=always $(git rev-parse --sq-quote "$@") | perl -pe \"s|^|\$name/|\"" | less -R; }

git-greps -nIE '\w+\(\w*\)'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM