Bash

如何為“git add **/”添加別名

  • April 13, 2021

我似乎無法為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

  1. 別名ga擴展為noglob ga
  2. 多虧了noglobprecommand 修飾符noglob ga foo* bar它不會擴展萬用字元 in foo*,而是foo*按字面意思作為參數傳遞給ga.
  3. 由於ga(the one in noglob ga …) 不是命令中的第一個單詞,因此它不會作為別名查找,因此它指的是使用參數foo*和呼叫的函式bar
  4. $^~@使用${^spec}and${~spec}參數展開形式。修飾符^導致**/被添加到數組的每個元素之前$@,從而導致**/foo*and **/bar。沒有這個修飾符,**/$@將擴展為**/foo*and bar
  5. $~@導致參數中的萬用字元現在被擴展。這樣,模式foo*本身就不會擴展:擴展的是**/foo*,所以它匹配sub/dir/foobar.
  6. . glob 限定符只匹配正常文件。使其-.也匹配到正常文件的符號連結,或@.匹配除正常文件之外的所有符號連結。
  7. 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 ..

引用自:https://unix.stackexchange.com/questions/644769