使用通配符的“ git add”不能像我希望的那样起作用——我必须将 cd 插入特定的目录吗?

当我尝试做一个基本的 git add *.erb(或任何简单的通配符表达式) git 是不能识别它(他们)。作为一个附带说明,我从来没有这样做过,所以我肯定这是一个新手的错误,但我没有发现任何帮助,在其他 SO 职位或我学校的校友名单服务,所以我认为这个职位可能是合适的。

(另一个不同的)例子是,Git 状态给了我:

#   modified:   config/routes.rb
#   modified:   spec/models/question_spec.rb

我想只上台的路由文件,所以我尝试 Git add * SRB和没有骰子。我在应用程序的根目录... 我是否需要在目录中包含我试图应用通配符表达式的文件?那会很痛苦,但是... 事实上... 它起作用了。

希望这不必是一篇单独的文章,但是有没有一种更简单的方法来使用通配符,在这种情况下您不必将 cd 放到特定的目录中?

37974 次浏览

根据我的经验(我可能漏掉了一个选项或其他东西) ,git add 只查看工作目录和子目录中的文件。因此,如果您想添加所有内容,请转到回购的根目录。但如果回购真的很大,这可能需要一段时间,特别是如果你没有通过-u 标志。

用单引号,应该可以。

git add '*s.rb'

更新

经过更多的测试,我发现我甚至可以做 git add *s.rb没有引号。这可能只适用于我的 git 版本1.7.10.4(Mac OSX Lion,自制程序)。我的解释是,如果 shell 通配符展开不匹配任何文件,它将向 git add提供原始的未展开参数‘ * s.rb’。

sh-3.2$ git status
#
#   modified:   config/routes.rb
#   modified:   spec/models/products_spec.rb
#

现在我做 git add没有引号。

sh-3.2$ git add *s.rb

居然有用!

sh-3.2$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   config/routes.rb
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   spec/models/products_spec.rb
#

如果通配符模式不匹配任何文件,git 将发出此错误。

sh-3.2$ git add *x.rb
fatal: pathspec '*x.rb' did not match any files

我无法让递归的 Globs 为我工作,因为我的 bash 版本太旧了。所以我要做的是

find . -name "*.rb" | xargs git add

工程一个款待,我可以添加其他过滤器,如果我需要-所以如果我想添加所有,但一个文件,我可以这样做。

find . -name "*.rb" | grep -v "not_me.rb" | xargs git add

还有其他几个案子可能会有用。

如果您只是想添加文件,已经存在于您的回购,您可以

git add -u .

如果你想加上所有的东西

git add .

你也可以尝试用 git 的神奇签名来匹配一条路径。

git add ':(glob)**/*.ext'

你可在此浏览更多 https://css-tricks.com/git-pathspecs-and-how-to-use-them/资讯