16

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

git add *filename.java.

但是我以前也这样做过:

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

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

git add *filename*

但这做了一些奇怪的事情。它添加了每个未跟踪的文件。我可以看到失败的可能原因,但它们都应该发生在前两个命令之一中,所以我不知道为什么会这样。

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

信息:

我正在使用基于minGW的Git Bash for Windows

4

2 回答 2

20

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

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

$ ls -d *filename.java

对比

$ ls -d *filename*

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


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

$ git add --dry-run --verbose -- *filename*

例如:这应该向您展示它如何真正扩展 glob 以及它有什么影响。

请注意--... 如果您使用的 glob可能与带有前导的文件名匹配-,请务必确保 git 知道它是文件名而不是选项。

不幸的是,这只会显示与 glob 匹配的文件,并且在索引和工作副本之间存在一些差异。


作者的回答: 试运行帮助很大,这是我发现的:

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

我的下一步是删除 .class 并再次尝试该命令:它成功了!仍然无法解释为什么 git bash 在找到两个匹配项时添加了所有内容......因为空运行的行为与实际运行不同,我认为肯定存在错误,但我认为讨论将在其他地方举行(除非有人认为它不是错误)。

于 2012-08-15T11:51:47.267 回答
1

你可以试试git add ./**/*.java

注意:我用 zsh 测试过,它也应该适用于 bash。

于 2020-10-07T17:18:38.000 回答