git add *(星号)vs git add。(期)


129

我是git的新手,我对在git中添加文件有疑问。我发现约之间的差异多个计算器的问题git add .git add -agit add --allgit add -A等,但我一直无法找到解释了什么地方git add *呢。我什至查看了git add手册页,但没有帮助。我一直在用它代替git add .我的同事问我为什么。我没有答案。我一直都用过git add *

git add .git add *一样吗?一个仅从当前目录添加更改的文件,而另一个仅从递归添加当前目录和子目录的文件吗?

在另一个堆栈问题中列出了一个很棒的图表,该图表显示了git add -A git add .and 之间的区别git add -u,但没有git add *

在此处输入图片说明

注意:我了解使用星号作为通配符(添加具有给定扩展名的所有文件)的含义。例如,git add *.html想补充一点,有一个所有文件.html的扩展名(但忽略.css.js等)。

谢谢您的帮助!


1
那张图从哪里来?我只是git add .再次尝试,它上演了删除文件的问题,这与该X行中的建议不同。
大卫

@David该图像来自此答案,适用于git的较早版本。
jerry

4
图片过时了!Git 2.x有所不同:i.stack.imgur.com/KwOLu.jpg
Hannes Schneidermayer

Answers:


131

add *表示添加当前目录中的所有文件,但名称以点开头的文件除外。这是您的Shell功能,Git只会收到文件列表。

add . 在您的shell中没有特殊含义,因此Git递归添加整个目录,这几乎是相同的,但包括名称以点开头的文件。


6
如此git add .添加所有文件,文件夹和子文件夹,包括.gitignore以及以点开头的任何其他内容,而git add *会添加任何文件,文件夹和子文件夹,但以点开头的文件,文件夹和子文件夹除外?准确吗?
Tyler Youngblood 2014年

9
确实是正确的。此外,git add *如果它们位于子目录中,则仍将添加以点开头的文件。
丹尼斯

4
git add .也尊重.gitignore,而git add *如果任何非点文件被gitignored ,将抛出错误。git add .比使用好得多git add *
rosuav

2
值得注意的是:如果从CMD.EXE在DOS / Windows上调用Git,则扩展的是Git而不是Shell *。在这种情况下,Git将找到点文件。
torek

2
@ Thor84no:即使引用Linux *来保护它,也可以在Linux系统上找到该点文件。这与隐藏的问题无关,只是Git的内置规则有所不同。
torek

30

*不是git的一部分-它是shell解释的通配符。*扩展到当前目录中的所有文件,然后才传递给git,这就是add全部。 .是当前目录本身,并且git adding将添加该目录及其下的所有文件。


1
那么,是否有理由使用星号?使用它代替句点有什么好处吗?或相反亦然?我确定我在教程中看到了。我不会以其他方式使用它。我并不是一个命令行专家(毫无疑问,您已经猜到了)。
Tyler Youngblood 2014年

5
*避免使用隐藏文件(即名称以开头的文件.)。无论如何,如果您不添加特定文件,则只使用git add -u(或者git add -A如果您要创建新文件)。
Mureinik 2014年

3
既然你们俩都回答了我的问题,我很难决定应该归功于谁。我之所以选择以下丹尼斯,是因为他的代表人数少于您。因此,我认为给他绿色支票比给您带来的好处更多。我希望这是有道理的?但我真的很感谢两种解释。谢谢!
Tyler Youngblood 2014年

7

使用圆点 . 在外壳程序中通常表示“当前目录”。

*外壳上使用星号时,称为file-globbing。例如在bash上,该功能glob()就是这样做的。glob(man 7 glob)的手册页指出:

描述

Long ago, in UNIX V6, there was a program /etc/glob that would expand 
wildcard patterns.  Soon afterward this became a shell built-in.
These days there is also a library routine glob(3) that will perform this 
function for a user program.

通配符匹配

A string is a wildcard pattern  if it contains one of the characters '?', '*' or '['. 

乱语

Globbing is the operation that expands a wildcard pattern 
into the list of pathnames matching the pattern.

这意味着当您将参数传递给命令行中包含以下内容的任何程序时 '?''*'或的,'[',第一通配扩展通配符模式到文件列表,然后让这些文件作为参数传递给程序本身。

'git add .'和之间的含义差异'git add *'Denis清楚地描述:

git add希望添加文件列表。在上面的示例中,shell展开*.分别扩展,并将结果作为参数添加到git add中。现在的区别是,使用git add .git可以扩展到当前目录,而git add *触发文件遍历,并且这样可以扩展到所有不以点开头的文件和目录。


5

为了清楚起见,我将答案放在下表中:

在此处输入图片说明

其他说明(受@ reka18评论启发):

注1. git add -Agit add -u命令,而无需额外的参数执行将是额外的细化(为文件名的子目录或面罩指示),在整个工作目录(也如果我们执行该目录的子目录工作的命令)的范围内正常工作。

注2..*分别的目录路径(当前目录)和通配符,该澄清命令的路径。例如,如果git add .or git add *命令在工作目录的某个子目录中执行,则它们的操作仅在此子目录中使用,而不是在整个工作目录中使用。

注3.git add -Agit add -u命令可以通过添加一个路径或掩模文件,例如,进一步细化git add -A app/controllersgit add -u app\styles\*


2
那么从Git v2.x开始git add -Agit add .它们是相同的吗?
reka18

谢谢@ reka18,提出了一个很好的问题。这启发了我完成我的答案...回答你的问题:如果你把它在工作目录中没有,但如果在一个子目录,然后是(git add -A适用于整个工作目录,并git add .始终将当前目录)。
simhumileco

2
  • git add -A (--all)添加所有内容,以便磁盘上的文件夹中的所有内容都显示在暂存区域中

  • git add . 暂存所有内容,但不删除已从磁盘删除的文件

  • git add * 暂存所有内容,但不暂存以点开头的文件,不会删除已从磁盘删除的文件

  • git add -u (--update)仅登台修改过的文件,删除已从磁盘删除的文件,不添加新文件

  • git add <file name 1> <file name 2> 仅添加某些文件

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.