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

Tyl*_*ood 113 git version-control git-add

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

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

在其他一个堆栈问题上列出了一个很好的图表,显示了git add -A git add .和之间的差异git add -u,但它没有git add *.

在此输入图像描述

注意:我理解将星号用作通配符意味着什么(添加具有给定扩展名的所有文件).例如,git add *.html想补充一点,有一个所有文件.html的扩展名(但忽略.css,.js等).

谢谢您的帮助!

Den*_*nis 109

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

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

  • 这确实是正确的.此外,如果`git add*`位于子目录中,它仍然会添加以点开头的文件. (7认同)
  • 所以`git add .`添加了所有文件,文件夹和子文件夹,包括.gitignore和其他以点开头的东西,而`git add*`会添加任何文件,文件夹和子文件夹,除了以点开头的那些文件,文件夹和子文件夹?那是准确的吗? (5认同)
  • 值得注意的是:如果在 DOS/Windows 上从 CMD.EXE 调用 Git,扩展 `*` 的是 *Git*,而不是 shell。在这种情况下,Git 会找到点文件。 (4认同)
  • `git add .`也尊重.gitignore,而`git add*`会抛出错误,如果有任何非点文件被gitignored.使用`git add .`比使用`git add*`更好. (3认同)
  • @Thor84no:即使在 Linux 系统上 Git 也会找到点文件,如果您引用 `*` 以保护它免受 shell 的影响。这不是隐藏位的问题,只是Git的编译规则不同。 (3认同)
  • 答案有点令人困惑,因为前一种方法说“当前目录中的所有文件”,而后者说“递归整个目录”。人们可能会认为前者(即“add *”)仅在第一层添加文件(而不是文件夹),但不递归。 (3认同)

Mur*_*nik 25

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

  • 既然你们都回答了我的问题,我很难决定该归功于谁。我在下面选择了丹尼斯,因为他的代表比你少。所以我认为给他绿色支票对他的好处比对你的好处多。我希望这是有道理的?但我真的很欣赏这两种解释。谢谢! (5认同)
  • `*`避免隐藏文件(即,名称以`.`开头的文件).无论如何,如果你没有添加特定的文件,我只会使用`git add -u`(或者如果你正在创建新文件,则使用`git add -A`). (4认同)
  • 那么使用星号是否有理由呢?使用它代替句号有什么好处吗?或相反亦然?我确信我在教程中看到过它。否则我不会知道要使用它。我不太喜欢命令行(正如您无疑已经猜到的那样)。 (2认同)

Ste*_*fen 20

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

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

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

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

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

  • 不带标志的 `git add` 不会忽略已删除的文件(不再)。这种行为很久以前就发生了变化。另请参阅此处:https://git-scm.com/docs/git-add#Documentation/git-add.txt-ltpathspecgt82308203 (3认同)

cod*_*ave 6

. 在shell中使用点通常表示"当前目录".

*shell上使用星号时,会使用调用的功能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.
Run Code Online (Sandbox Code Playgroud)

通配符匹配

A string is a wildcard pattern  if it contains one of the characters '?', '*' or '['. 
Run Code Online (Sandbox Code Playgroud)

通配符

Globbing is the operation that expands a wildcard pattern 
into the list of pathnames matching the pattern.
Run Code Online (Sandbox Code Playgroud)

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

Denis明确描述了'git add .'和之间的含义差异:'git add *'

git add期望添加文件列表.在上面的例子中,shell展开*.分别将结果作为参数提供给git add.现在不同的是,git add .git将扩展到当前目录,而git add *触发文件通配符,这样扩展到所有不以点开头的文件和目录.


sim*_*eco 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\*

  • 那么从Git v2.x开始,git add -A和git add是相同的吗? (2认同)

小智 5

在旧版本的 git 中,git add .不会从索引中删除已删除的文件,因此git add -A建议这样做。在最新版本的 git 中,这种情况已不再是这样。现在,只要从工作树的根文件夹执行每个命令git add .就与git add -A. 但是,如果git add .从子文件夹运行,则它仅递归更新该文件夹及其子文件夹中文件的索引,而git add -A仍会执行工作树中的所有文件。

关于这方面的文档不是特别清楚,但我通过直接使用 git 版本 2.42.0.windows.1 进行实验验证了上述信息。