【问题标题】:git add * (asterisk) vs git add . (period)git add *(星号)与 git add 。 (时期)
【发布时间】:2014-11-20 10:49:57
【问题描述】:

我是 git 新手,我有一个关于在 git 中添加文件的问题。我发现了多个关于git add .git add -agit add --allgit add -A 之间区别的stackoverflow 问题。但我一直无法找到解释git add * 作用的地方。我什至看过git add man page,但没有帮助。我一直在用它代替git add .,我的同事问我为什么。我没有答案。我一直用git add *

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

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

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

感谢您的帮助!

【问题讨论】:

  • 那张图表来自哪里?我刚刚再次尝试git add .,它暂存了一个已删除的文件,这与该行中的X 所建议的不同。
  • @David 该图片来自this answer,适用于旧版本的 git。
  • 图片过时了! Git 2.x 不同:i.stack.imgur.com/KwOLu.jpg

标签: git version-control git-add


【解决方案1】:

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

【讨论】:

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

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

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

【讨论】:

  • so git add . 添加所有文件、文件夹和子文件夹,包括 .gitignore 和以点开头的任何其他内容,而 git add * 将添加任何文件、文件夹和子文件夹,除了以点开头的文件、文件夹和子文件夹一个点?准确吗?
  • 确实是这样。此外,git add * 仍会添加以点开头的文件(如果它们位于子目录中)。
  • git add . 也尊重 .gitignore,而 git add * 将在任何非点文件被 gitignored 时抛出错误。使用git add . 比使用git add * 好得多。
  • 值得注意:如果在 DOS/Windows 上从 CMD.EXE 调用 Git,扩展 * 的是 Git,而不是 shell。在这种情况下,Git 会找到点文件。
  • @Thor84no:如果你引用 * 来保护它免受 shell 的影响,Git 即使在 Linux 系统上也会找到点文件。这不是隐藏位的问题,只是Git的编译规则不同。
【解决方案3】:

在 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.

通配符匹配

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 * 触发文件通配,这样会扩展到所有不以点开头的文件和目录。

【讨论】:

    【解决方案4】:

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

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

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

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

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

    【讨论】:

    • 那么从 Git v2.x 开始,git add -Agit add . 是否相同?
    • 谢谢@reka18,提出了一个非常好的问题。它启发了我完成我的答案...您问题的答案:如果您在工作目录中调用它,则不,但如果在子目录中,则可以(git add -A 适用于整个工作目录,git add . 始终当前目录)。
    • 这对我来说是最好的答案。其他的都有点模糊,虽然归根结底都是一样的。
    • 谢谢@Duke! :)
    【解决方案5】:
    • git add -A (--all) 添加所有内容,以便磁盘上文件夹中的所有内容都显示在暂存区域中

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

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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-14
    • 2013-07-17
    • 2018-07-09
    • 2016-11-06
    • 1970-01-01
    • 2010-10-09
    相关资源
    最近更新 更多