Bash
如何為“git add **/”添加別名
我似乎無法為
git add **/
我認為這兩個星號引起了問題,或者可能是正斜杠。我該如何解決這個問題?
到目前為止我已經嘗試過
alias ga='git add **/'
當我在終端中執行上面的別名時,我發出這個命令
ga somename.java
,如果沒有別名,它將是等價的git add **/somename.java
。我還嘗試添加更多星號、斜杠、美元符號和引號等。
ga somename.java
是 的縮寫git add **/ somename.java
。別名的第一個參數沒有連接到別名中的最後一個單詞。您可以這樣想:您鍵入的空格ga
不會被刪除。要執行比為命令提供備用名稱或將參數傳遞給命令更複雜的事情,請使用函式而不是別名。
這是一個非常通用的 zsh 版本。
function ga { git add **/$^~@(.N) } alias ga='noglob ga'
以下是它的工作原理
ga foo* bar
:
- 別名
ga
擴展為noglob ga
。- 多虧了
noglob
precommand 修飾符,noglob ga foo* bar
它不會擴展萬用字元 infoo*
,而是foo*
按字面意思作為參數傳遞給ga
.- 由於
ga
(the one innoglob ga …
) 不是命令中的第一個單詞,因此它不會作為別名查找,因此它指的是使用參數foo*
和呼叫的函式bar
。$^~@
使用${^spec}
and${~spec}
參數展開形式。修飾符^
導致**/
被添加到數組的每個元素之前$@
,從而導致**/foo*
and**/bar
。沒有這個修飾符,**/$@
將擴展為**/foo*
andbar
。$~@
導致參數中的萬用字元現在被擴展。這樣,模式foo*
本身就不會擴展:擴展的是**/foo*
,所以它匹配sub/dir/foobar
..
glob 限定符只匹配正常文件。使其-.
也匹配到正常文件的符號連結,或@.
匹配除正常文件之外的所有符號連結。N
glob 限定符導致不匹配的模式被省略。(N)
如果其中一個模式不匹配任何內容,如果您希望出現錯誤,請不要放置。這裡缺少的唯一一件好事是完成,這是可行的,但我認為在這裡不值得麻煩。
在 bash 中,你不能擁有它。沒有辦法防止萬用字元立即被擴展,所以
ga foo*
將相當於ga foo1 foo2
目錄內容是.git … foo1 foo2 subdir subdir/foobar
這將錯過
subdir/foobar
。在 bash 中,由於您需要在參數中引用萬用字元,您不妨在pathspec中依賴 Git 自己的模式匹配。特別注意
*
匹配目錄分隔符,即它具有**
內置的 shell 行為。function ga { local x for x in "$@"; do git add "*/$x" done } ga 'foo*' bar
最後一點,如果您保持
.gitignore
最新並經常送出,那麼除了git add .
.