我似乎无法添加别名git add **/
我认为这两个星号引起了问题,或者可能是正斜杠。我该如何解决这个问题?
到目前为止我已经尝试过
alias ga='git add **/'
当我在终端中运行上述别名时,我发出此命令,ga somename.java
如果别名不存在,则该命令等效git add **/somename.java
。
我还尝试添加更多星号、斜杠、美元符号,后跟引号等。
答案1
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
前置命令修饰符,noglob ga foo* bar
不会扩展 中的通配符foo*
,而是按foo*
字面意思作为参数传递给ga
。 - 由于
ga
( 中的那个) 不是命令中的第一个单词,因此它不会作为别名查找,因此它引用使用参数和noglob ga …
调用的函数。foo*
bar
$^~@
使用${^spec}
和${~spec}
参数扩展形式。修饰符^
会**/
被添加到数组的每个元素之前$@
,从而产生**/foo*
和**/bar
。如果没有此修饰符,**/$@
将扩展为**/foo*
和bar
。$~@
导致参数中的通配符现在被扩展。这样,模式foo*
不会自行扩展:扩展的是**/foo*
,因此它匹配诸如 之类的东西sub/dir/foobar
。- 这
.
全局限定符只匹配常规文件。使其-.
也匹配常规文件的符号链接,或者@.
除了常规文件外还匹配所有符号链接。 - 这
N
全局限定符导致忽略不匹配的模式。(N)
如果您希望在其中一种模式与任何内容都不匹配时出现错误,请不要输入。
这里唯一缺少的好处是完成度,即可行的但我认为不值得在这里麻烦。
在 bash 中,你不能拥有它那么好。无法阻止通配符立即展开,因此ga foo*
相当于ga foo1 foo2
目录内容
.git …
foo1
foo2
subdir
subdir/foobar
哪会错过subdir/foobar
。
在 bash 中,由于您需要在参数中引用通配符,因此您不妨依赖 Git 自己的模式匹配路径规范。请特别注意匹配目录分隔符,即它具有内置的*
shell行为。**
function ga {
local x
for x in "$@"; do
git add "*/$x"
done
}
ga 'foo*' bar
最后一点,如果您保持.gitignore
最新状态并经常提交,那么除了git add .
.
答案2
您可以告诉我们find
进行递归搜索并运行,而不是完全依赖 shell extglob 。git add
ga() {
local -a find_args
local arg
for arg in "$@"; do
find_args+=( -o -name "$arg" )
done
find . '(' -false "${find_args[@]}" ')' -exec git add -- {} +
}