使用两个星号在git中添加文件

Pau*_*aul 11 regex git glob wildcard git-bash

我想添加一个文件,该文件具有唯一的文件名,但前面的路径很长(例如a/b/c/d/filename.java).通常我会通过这样做将它添加到我的存储库中

git add *filename.java.

不过我之前也这样做过:

git add a/b/c/d/filename*

所以我试着将两者结合起来:

git add *filename*

但这确实很奇怪.它添加了每个未跟踪的文件.我可以看到失败的可能原因,但它们都应该出现在前两个命令之一中,所以我不知道为什么会发生这种情况.

我的问题不在于如何使用文件名将文件添加到git存储库(尽管这很有用).我的问题是我对*操作的误解是什么让我认为上述应该有效.

信息:

我正在使用Git Bash for Windows,它基于minGW.

Use*_*ess 13

您正在查看globs (不是正则表达式,这是一种不同的模式匹配语言),它们是由shell扩展的,而不是由git扩展.

如果你想看看它们将如何匹配,只需将相同的glob传递给另一个命令,例如.

$ ls -d *filename.java
Run Code Online (Sandbox Code Playgroud)

VS

$ ls -d *filename*
Run Code Online (Sandbox Code Playgroud)

(我刚刚添加了-dso ls并没有显示匹配的任何目录的内容)


由于你正在使用git bash,并且glob扩展可能与常规shell的行为不同,请尝试

$ git add --dry-run --verbose -- *filename*
Run Code Online (Sandbox Code Playgroud)

例如:这应该向您展示它如何真正扩展glob以及它具有什么效果.

注意--......如果你使用的文件可能与带有前导的文件名相匹配-,那么确保git知道它是文件名而不是选项是很重要的.

不幸的是,这只会显示匹配glob的文件,并且索引和工作副本之间有一些区别.


作者回答: 干跑很有帮助,这是我发现的:

我忘记了我没有添加的bin文件夹,所以当我执行干运行时,我意识到它找到了两个匹配:filename.java和filename.class.当我将glob更改为*filename.j*有效时.

我的下一步是删除.class并再次尝试命令:它工作了!仍然无法解释为什么git bash在发现两个匹配时添加了所有内容...因为干运行与实际运行不同我认为必定存在错误,但我认为讨论将在别处进行(除非有人认为不是一个bug).

  • @Paul:Git实际上可以并且确实评估了globs,如果它在参数列表中得到完整的话.如果引用包含glob的名称(例如`'*filename*'`),或者没有与命令行中指定的glob匹配的文件名,则可能会发生这种情况.奇怪的是,它似乎将''*filename'解释为"在任何目录中以`filename`结尾的任何东西",但它不能用`'*/*filename'`或''**/*filename ',正如我所料. (6认同)