2014-09-25 167 views
65

我是新来的混帐,我有一个关于在git中添加文件的问题。我发现了多个有关git add .git add -a,git add --all,git add -A等之间差异的计算器问题。但是我一直无法找到解释git add *的作用的地方。我甚至看过git add man page,但它没有帮助。我一直在用它代替git add .,我的同事问我为什么。我没有答案。我一直使用git add *git add *(星号)vs git add。 (期)

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

有上显示git add -Agit add .git add -u之间的差异等问题叠一个上市一个伟大的图表,但它没有git add *

enter image description here

注:我知道这意味着什么使用星号作为通配符(添加具有给定扩展名的文件)。例如,git add *.html将添加扩展名为.html的所有文件(但忽略.css.js等)。

感谢您的帮助!

+1

图表从哪里来?我刚刚尝试过'git add .',并且它演示了一个删除的文件没有问题,不像那个行中的'X'。 – David 2015-08-05 16:27:35

+0

@David该图像来自[此回答](http://stackoverflow.com/a/26039014/1270168)并适用于旧版本的git。 – jerry 2016-07-21 17:52:55

+2

图片已过时! Git 2.x是不同的:https://i.stack.imgur.com/KwOLu.jpg – 2017-05-11 10:08:26

回答

63

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

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

+3

'git add .'添加所有文件,文件夹和子文件夹,包括.gitignore和其他任何以点开头的内容,而'git add *'会添加任何文件,文件夹和子文件夹,但以点开头的文件,文件夹和子文件夹除外?这是否准确? – Tyler 2014-09-25 16:24:44

+5

这确实是正确的。另外,'git add *'仍然会添加以点开头的文件,如果它们在子目录中的话。 – Denis 2014-09-25 16:42:55

+1

'git add .'也尊重.gitignore,而'git add *'如果任何非点文件都是gitignored,将会抛出一个错误。使用'git add .'比'git add *'更好。 – rosuav 2016-07-18 22:26:26

12

*不是git的一部分 - 它是由shell解释的通配符。 *扩展到当前目录中的所有文件,然后只传递给git,它们都是add.是当前目录本身,它会添加它以及它下面的所有文件。

+0

那么每个人都有一个理由使用星号?使用它而不是一段时间有什么好处?或相反亦然?我确定我在教程中看到了它。否则我不会知道使用它。我不是一个命令行家伙(正如你无疑猜到的)。 – Tyler 2014-09-25 16:26:22

+2

'*'避免隐藏文件(即其名称以'.'开头的文件)。无论如何,如果你没有添加特定的文件,我只需要使用'git add -u'(或者如果你正在创建新文件,则使用'git add -A')。 – Mureinik 2014-09-25 16:49:36

+0

由于你们都回答了我的问题,所以我很难决定给谁信用。我选择丹尼斯是因为他的代表比你低。所以我想给他绿色的支票会让他受益多于对你有益的。我希望这是有道理的?但我很欣赏这两个解释。谢谢! – Tyler 2014-09-25 19:04:23

4

在shell中使用点.通常表示“当前目录”。

当您在shell上使用星号*时,将使用名为file-globbing的功能。例如。在bash上功能​​3210就是这样做的。为水珠的手册页(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 *会触发文件通配,并且会扩展到所有不以点开头的文件和目录。