当存在被忽略的文件时,我该如何使用通配符进行git-add操作?

32

我在Windows 7 x64上使用msysgit。当有些文件可能被.gitignore忽略时,我无法弄清楚如何告诉Git添加许多文件。例如:

  1. 初始化一个git存储库。
  2. 创建一个包含以下内容的.gitignore文件:

    *.foo
    
  3. 创建 "test.txt" 和 "test.foo" 文件。

  4. 尝试使用 git add .

当我尝试这样做时,Git 抱怨说忽略了 test.foo 文件,如果我真的想添加它,应该使用 -f。我更想做的是添加除了已配置为被忽略的文件之外的所有文件。我查看了 git-add 文档,并且发现 -A 应该有帮助;文档中写道,“...并将所有未跟踪的文件添加到 .gitignore 机制未忽略的文件中。” 但是,当我尝试 git add -A . 时,我仍然遇到同样的错误。使用 -f 添加了被忽略的文件,这不是我想要的。(用例是从 VS 项目中批量添加文件,在忽略 .suo 和其他文件后。)

这个问题是我正在使用的 Git 实现的问题,还是有些我遗漏的 git-add 参数?


1
注意:使用Git 2.3.0(2015年2月)版本,“git add --ignore-errors *”将按预期工作。请参见下面我的回答。但是,“git add .”仍然是推荐的方式。 - VonC
我不太明白你的问题。你说“我想做的是添加除了被配置为忽略的文件之外的所有内容”,这正是git所说的。它添加了test.txt并忽略了test.foo。只是因为shell将*扩展为test.txt test.foo,所以从git的角度来看,你告诉它要添加test.foo,它警告你没有添加它,这正是你想要的。我错过了什么吗? - gman
4个回答

33

git add *命令报错,但git add .按预期执行(1.7.0.4, Linux)。

git-add(1)手册中可以得知:

git add命令默认不会添加被忽略的文件。如果在命令行中明确指定了任何被忽略的文件,git add将失败并列出被忽略的文件。Git通过目录递归或文件名通配符来遍历的被忽略的文件将被静默地忽略。(在shell中引用通配符的话需要添加引号)


奇怪,这是有什么特别的原因吗?文档是否解释了通配符/目录快捷方式的考虑方式? - OwenP
我已经添加了一段引用,描述了这种行为。 - wRAR
1
如果我想添加所有文件,那么这很好,但是如果我更改了10个文件,而我只想添加2个文件,怎么办?是否可以执行“git add *.txt”以添加所有更改的.txt文件? - Lance Fisher
为什么不行?*.txt 是由 shell 扩展的。 - wRAR
5
兰斯:如果你只想把文本文件添加到提交中,可以完全做到这一点,使用git add '*.txt'即可。你需要在通配符前添加引号以防止shell扩展*.txt,然后Git会浏览你的目录结构以寻找匹配的文件并将txt文件添加到提交中,请参考丹的回答。 - Erlend Leganger
@ErlendLeganger 可能将此评论转化为答案是一个不错的选择,因为它是最简单的解决方案,实际上回答了原始问题。 - kdb

13
请注意,您也可以使用单引号转义更复杂的通配符模式:

git add '*test*'

将允许 Git 执行自己的通配符匹配。


7
另一种方法是转义掉通配符,像这样:

git add \*

3
解释一个投反对票是一个好的做法。这个答案在我的系统上也有效,并且实际上在git-add手册页中有提到:“Git通过目录递归或文件名通配符来忽略文件时(在shell之前引用通配符),将会被静默忽略。” - jarvisschultz

2
请注意,即使某些文件被忽略,git add --ignore-errors *现在也可以正常工作。
请参见Git 2.3.0(2015年2月)的提交1d31e5a,作者为Michael J Gruber(mjg

add: 仅忽略被忽略的文件

bar 被忽略时,"git add foo bar" 不会添加 foobar,但会提示用户重新检查命令调用。但是,当 "git add foo.*" 经过 shell 扩展并且某些扩展文件被忽略时,这种行为就不那么有帮助了。

"git add --ignore-errors" 应该在索引一些文件时忽略错误并添加其他文件。它确实忽略了实际索引尝试中的错误,但不会忽略上述所述的错误 "file is ignored" 。这是意外的。

将 "git add foo bar" 更改为在忽略 bar 的情况下添加 foo,但像以前一样发出警告并返回失败代码。

也就是说,在尝试添加被忽略的文件时,我们现在的行为方式与使用 "--ignore-errors" 时对更严重的索引错误的处理方式相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接