Git不会添加某些通配符

3

我对此感到困惑。在OSX上的git中,您可以添加文件,例如:

git add *.java

它会添加所有扩展名为 *.java 的文件,同样适用于 .txt、json 等文件。但是,当我执行一个

git add *.xml

什么也没有发生。它没有在我的gitignore中指定,所以git将其报告为更改,并带有git状态,但我似乎无法使用通配符添加它。

我不是在问如何按模式递归添加文件,git(或bash?)已经解释了这一点,就像我在第一个示例中解释的那样。

系统:

  • OSX 10.10.5
  • GNU bash,版本3.2.57(1)-release(x86_64-apple-darwin14)
  • git版本2.3.8(Apple Git-58)

1
它可能会出现在全局忽略文件中。 - Colonel Panic
@ColonelPanic 两个地方都没有任何东西 - BrDaHa
作为第一步,我建议尝试通过路径显式添加其中一个XML文件,而不是使用通配符,以排除其他奇怪的问题。 - Colonel Panic
@ColonelPanic 我可以成功地做到这一点。我知道有一些解决方法,但我想知道为什么会发生这种情况。 - BrDaHa
@BrDaHa 我唯一能建议的是从头开始,慢慢添加东西,直到找到问题所在。摆脱你的 shell init 文件和 git config(只使用最小必要的设置),然后看看会发生什么。 - Colonel Panic
显示剩余11条评论
2个回答

4

引用通配符以便传递到git进行处理,而不是被shell扩展。

git add '*.xml'

啊,我以为这与shell扩展有关。谢谢!但是你知道为什么它会递归地(甚至)对*.java(不带引号)起作用吗? - BrDaHa
3
如果当前目录中没有.java文件,那么shell会像你输入git add '*.java'一样将*.java传递给git add命令。这假设你没有设置nullglob,否则git-add将不会得到任何参数。 - Schwern
完美,谢谢@Schwern! - BrDaHa

0
它们是嵌套的,因此有些在根目录中,有些在子文件夹中等等。 git add *.xml 只会添加当前目录中的 XML 文件。Shell globbing 不包括子目录。这是一个通用的 shell 问题。
如果您将字面上的 glob 传递给 git add,它将递归应用它。
git add '*.xml'

这是 git-add 的一个功能。如果你想要一般类似的东西,你可以在 bash 4 中打开递归通配符
git add **/*.xml

或者您可以使用 findxargs

find . -name '*.xml' | xargs git add

1
你不需要使用globstar两次指定模式:git add **/*.xml就足够了。 - gniourf_gniourf
find 包含了自身的循环:find . -name '*.xml' -exec git add {} \+ - Jason Hu
另外,请不要像这样使用 xargs... find 具有 -exec 来避免(破碎的)诡计,比如 find . -name '*.xml' -exec git add {} +。顺便说一下,两者略有不同:find 将找到隐藏文件,但是 shell 通配符不会,_除非设置了 shopt -s dotglob 。此外,使用 find 可以(也许应该)指定 -type f;而使用 shell 通配符则无法避免目录被匹配到。 - gniourf_gniourf
1
实际上,仔细想想:find将会在.git/文件夹中递归查找(除非你告诉它不要这样做,这变得更加棘手)... 最好的选择是让git通过git add '*.xml'来处理它。 - gniourf_gniourf
@gniourf_gniourf 你说得对,我使用的是旧版本的bash。至于find进入.git目录,你也是对的,但这大多是无害的。 - Schwern

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