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)
(我刚刚添加了-d
so 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).