【问题标题】:Using two asterisks to add a file in git使用两个星号在 git 中添加文件
【发布时间】:2012-08-11 17:10:18
【问题描述】:

我想添加一个具有唯一文件名但前面有很长路径的文件(例如 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

【问题讨论】:

  • 您使用的文件名实际上是字符串filename 还是您将其用作示例?
  • 这只是一个例子。
  • 如果您指的是最后一个命令,那么这不是正在发生的事情。事实上,我认为相反的情况正在发生:它匹配一切。如果我输入 git add 则不会添加任何内容。

标签: regex git wildcard glob git-bash


【解决方案1】:

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

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

$ ls -d *filename.java

$ ls -d *filename*

(我刚刚添加了-d,所以 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 在找到两个匹配项时添加了所有内容......因为空运行的行为与实际运行不同,我认为肯定存在错误,但我认为讨论将在其他地方举行(除非有人认为它不是错误)。

【讨论】:

  • 有趣的是,这给了我不同的结果。那么这是否意味着 Git 正在评估它?
  • Git 无法评估它,在 Git 运行之前发生全局化(在我知道的所有 shell 中)
  • 这可能是问题所在:我正在使用 Git Bash,它是 Windows 的 Git shell(我认为它使用了 minGW)。我会将其添加到我的第一篇文章中。
  • 顺便说一句,将*.class 添加到.gitignore 文件可能是明智的,假设您永远不希望它们提交。
  • @Paul:Git 实际上可以并且确实评估 glob,如果它在它的参数列表中完整地保存它们。如果您引用包含 glob 的名称(例如 '*filename*'),或者没有与命令行上指定的 glob 匹配的文件名,则可能会发生这种情况。奇怪的是,它似乎将'*filename' 解释为“任何目录中以filename 结尾的任何东西”,但它并没有像我预期的那样对'*/*filename''**/*filename' 执行此操作。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 2021-06-02
    相关资源
    最近更新 更多