git add '*.txt'和git add *.txt有什么区别?

6

我刚刚在 Code School 学习 git 课程 https://try.github.io/levels/1/challenges/1,对于 git add '*.txt' 和 git add *.txt 的不同行为感到困惑。

没有引号的字符串并没有添加所有内容。git rm 同样如此。为什么会这样?或者这只是网页版本特有的问题吗?


看起来像是(Linux)shell(例如bash)中的常规文件名引用。 - R Yoda
1个回答

7
如 "引号内的通配符" 中所述,无论是单引号还是双引号中都不支持 globbing。

文件通配符(例如 *.c)可以添加所有匹配的文件。

  • 不使用引号时,shell 会在当前文件夹中进行 globbing。
  • 使用引号时,它会防止 shell 进行 globbing,并允许 Git(与我的初始答案相反)在整个工作树上处理pathspec "*.txt"。

你可以在t/t4010-diff-pathspec.sh#L53-L56中看到示例


提交8300016Junio C Hamano (gitster)添加了另一种防止文件通配符的方法,以及一些解释:

gitcli: 对比shell和git中的通配符

不习惯使用shell的人可能会在理解命令行参数如何被shell处理方面有智力上的理解,但仍然很难想象让shell扩展文件通配符与Git看到文件通配符以用作路径规范之间的区别。

许多命令允许在路径中使用通配符,但需要保护它们免受shell的影响。这两个意思是不同的:

--------------------------------
$ git checkout -- *.c
$ git checkout -- \*.c
-------------------------------- 
  • 前者允许您的 shell 展开文件通配符,而您正在请求将工作树中的点-C 文件覆盖为索引中的版本。
  • 后者将 *.c 传递给 Git,并要求检出与该模式匹配的索引中的路径到您的工作树。

1
太好了!所以,git add '*.txt'git add \*.txt会完成相同的工作。 - avasin
1
@avasin 是的,任何阻止 shell 进行 globbing 的东西。 - VonC

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