65

当我尝试做一个基本的git add *.erb(或任何简单的通配符表达式)时,git 无法识别它(它们)。作为旁注,我以前从未这样做过,所以我确信这是一个新手错误,但我在其他 SO 帖子或我学校的校友列表中没有找到任何帮助,所以我认为这篇文章可能是合适的。

对于(一个不同的)示例,git status给了我:

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

我只想暂存路由文件,所以我尝试了git add *s.rb并且没有骰子。我在应用程序的根目录中...我是否需要在包含我试图应用通配符表达式的文件的目录中?那会很痛苦,但是……实际上……它只是奏效了。

希望这不必是一个单独的帖子,但是有没有更简单的方法来使用通配符,您不必 cd 进入特定目录?

4

4 回答 4

100

把它放在单引号周围。这应该有效。

git add '*s.rb'

更新

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

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
于 2012-08-22T04:15:52.490 回答
6

由于我的 bash 版本太旧,我无法让递归 glob 为我工作。所以我要做的是

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

工作得很好,如果需要,我可以在那里添加其他过滤器 - 所以如果我想添加除一个文件之外的所有文件,我可以这样做。

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

还有其他几个有用的案例。

如果您只想添加存储库中已经存在的文件,您可以

git add -u .

如果您想添加所有内容

git add .
于 2012-08-22T04:25:48.750 回答
2

您还可以尝试使用 git 的魔法签名来通过 glob 匹配路径,例如

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

在这里查看更多https://css-tricks.com/git-pathspecs-and-how-to-use-them/

于 2021-08-16T14:42:27.797 回答
0

根据我的经验(我可能缺少一个选项或其他东西), git add 只查看当前目录和子目录中的文件。因此,如果要添加所有内容,请转到 repo 的根目录。虽然如果 repo 真的很大,这可能需要一段时间,特别是如果你不通过 -u 标志。

于 2012-08-22T04:13:49.390 回答