关于版本控制:git add *(星号)vs git add。

git add * (asterisk) vs git add . (period)

我是Git的新手,我有一个关于在Git中添加文件的问题。我发现了关于git add .git add -agit add --allgit add -a等之间的差异的多个stackoverflow问题,但我找不到一个解释git add *所做操作的地方。我甚至看过Git添加手册页,但没有用。我用它代替了git add .,我的同事问我为什么。我没有答案。我一直在用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等)。

谢谢你的帮助!


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

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


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


在shell中使用dot .通常意味着"当前目录"。

在shell上使用星号*时,将使用名为file-globbing的功能。例如,在bash上,函数glob()就是这样做的。glob(man 7 glob版)的手册页说明:

DESCRIPTION

1
2
3
4
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.

Wildcard matching

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

Globbing

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

这意味着,当您将参数传递给命令行上包含'?''*''['的任何程序时,首先全局化将通配符模式扩展为文件列表,然后将这些文件作为参数提供给程序本身。

丹尼斯清楚地描述了'git add .''git add *'之间的含义差异:

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


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

enter image description here

附加说明(灵感来自@reka18评论):

注1。在没有附加参数的情况下执行的git add -Agit add -u命令将是整个工作目录范围内的附加优化(子目录或文件名的掩码指示)工作(如果我们在目录的工作子目录中执行该命令)。

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

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