git:如何递归地添加符合glob模式的目录子树中的所有文件?

62

我有几个.screen文件在/xxx/documentation及其子目录中,这些文件已经被Git跟踪。

修改了很多这些屏幕文件后,我运行git add documentation/\\*.screen (如git-add文档的第一个示例所示)来暂存这些文件,但是该命令失败了:

fatal: pathspec 'documentation/\*.screen' did not match any files

我的命令有问题吗?还是Git有bug?


标记的答案对我有用,但需要注意的是每个通配符都需要单独用引号括起来,即 git add ' *.cpp *.h' 导致上述错误 fatal: pathspec ' *.cpp *.h' did not match any files,而 git add ' *.cpp' '*.h' 则可以正常工作。 - mirtan
6个回答

61

这是文档中的错误。使用以下命令并将星号用引号括起来

$ git add 'documentation/*.screen'

或者

$ git add documentation/\*.screen

以获取所需的行为。

如果您想仅添加当前目录中的文件,请使用

$ git add *.screen

更新:我提交了一个修补程序来更正此问题,现已在1.6.6.2版本中修复


这两个命令会导致相同的结果吗?如果只添加当前目录中的文件而不包括其子目录呢? - Phương Nguyễn
顺便说一下,Kubi提到在他的机器上命令运行得很好,你怎么看? - Phương Nguyễn
@Phuong 是的,这两个命令会导致相同的结果。如果只想在当前目录下添加文件,请不要引用参数(例如,git add *.screen)。我相信kubi和Aaron误解了你的问题,因为我也很惊讶地发现(谢谢你提醒我!)git-add有这个功能。 - Greg Bacon
@alex 我很好奇你的情况具体是什么导致它失败了。听起来上下文有足够的差异,值得提出一个单独的问题,我期待着阅读! - Greg Bacon

17

我尝试了已被接受的答案,但它对我没有起作用.. 所以在这里分享我的答案,以防有人想要完成工作而不想浪费时间分析可能导致问题的各个方面:

find documentation -name "*.screen" | xargs git add -u

//使用git-add命令的-u选项,将之前已经被跟踪并修改过的文件添加到索引中


在您的情况下,“documentation”是存储库工作树内部的目录名称,还是从工作树外部到达存储库顶层的相对路径? - Greg Bacon

4

我刚用这个解决了一个类似的git问题,使得它只添加目录中的所有文件:

find . | sed "s/\(.*\)/\"\1\"/g" | xargs git add 

对于原始问题,命令应该是:

find -name "*.screen" | sed "s/\(.*\)/\"\1\"/g" | xargs git add 

请注意,我正在处理文件名包含空格的情况。这就是我的回答原因。编辑第一个|之前的部分以选择要添加的不同文件。

4
你告诉Shell去查找*.screen(即这个字符串 - 但它不存在 - 而不是你想要的“所有以.screen结尾的文件”)。省略\\,这样Shell就可以为你扩展文件名。

在这个手册中,他们告诉我要添加双反斜杠 http://www.kernel.org/pub/software/scm/git/docs/git-add.html。你怎么看? - Phương Nguyễn
我已经阅读了示例并理解了他们想要做的事情(递归添加),但是为什么命令会失败呢?错误表明,要么目录中没有扩展名为“.screen”的文件,要么模式没有被扩展。 - Aaron Digulla
这很奇怪,因为当我删除双反斜杠时,该命令就没有错误。 - Phương Nguyễn

3

对我来说,git add *.java 可以递归地添加所有的Java文件。


1
哇,这对我也有效!但是只有在当前目录中没有.java文件的情况下才有效。如果有,那么只会添加这些文件。 - Robin Green

1

尝试

git add ./documentation/*.screen

这个命令只是从./documentation目录添加文件,而不是它的子目录吗? - Phương Nguyễn
你是对的。我刚在我的电脑上尝试了你的原始命令,它可以正常工作。 - kubi

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