如何为“git add **/”添加别名

如何为“git add **/”添加别名

我似乎无法添加别名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

  1. 别名ga扩展为noglob ga.
  2. 感谢noglob前置命令修饰符noglob ga foo* bar不会扩展 中的通配符foo*,而是按foo*字面意思作为参数传递给ga
  3. 由于ga( 中的那个) 不是命令中的第一个单词,因此它不会作为别名查找,因此它引用使用参数和noglob ga …调用的函数。foo*bar
  4. $^~@使用${^spec}${~spec}参数扩展形式。修饰符^**/被添加到数组的每个元素之前$@,从而产生**/foo***/bar。如果没有此修饰符,**/$@将扩展为**/foo*bar
  5. $~@导致参数中的通配符现在被扩展。这样,模式foo*不会自行扩展:扩展的是**/foo*,因此它匹配诸如 之类的东西sub/dir/foobar
  6. . 全局限定符只匹配常规文件。使其-.也匹配常规文件的符号链接,或者@.除了常规文件外还匹配所有符号链接。
  7. 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 -- {} +
}

相关内容