来自git add的警告。 vs git add *

时间:2019-02-19 12:11:01

标签: git

我对git add .git add *表现出的不同行为感到有些困惑。

我正在将CodeIgniter网站添加到我的存储库中(作为初始添加-该存储库当前为空)。

当我使用git add .时,所有文件都被添加,并且我的.gitignore受尊重。如果再尝试git add *(重置后),则会收到警告:

The following paths are ignored by one of your .gitignore files:
contributing.md

但是,它不会警告我有关其他文件的正确忽略;例如,在我的.gitignore中,

**/config/development/*

此目录仅包含database.php,此文件 被忽略。我没有收到git错误的警告,还是有合理的解释?

2 个答案:

答案 0 :(得分:3)

当您在bash提示符(或基本上是任何UNIX样式的shell提示符)下说git add *时,shell会展开*。 (在UNIX中,扩展glob被认为是shell的责任,它具有许多轻微的症状,例如这样的症状。)

这意味着,据git所知,您键入了类似的内容

git add aDiretory aFile anotherFile contributing.md someOtherDirectory

也就是说,它认为您专门要求它添加contributing.md。当您明确要求git add忽略 d的文件时,它不会执行此操作(除非您提供-f选项),并且它会显示一条警告消息,告诉您为什么不这样做。

它不会警告子目录中被忽略的文件,因为您没有明确命名要添加的文件。命名目录隐式表示您想将目录中的所有内容添加到该目录中,除了被忽略的内容,但是在这种情况下,被忽略的内容将被忽略。

当您说git add .时,您并没有明确命名任何文件-您只是隐式地说,您希望所有文件都位于.目录下。所以没有警告。

因为默认情况下git实际上不会添加被忽略的文件,所以通常没有关系。不过,这两个命令之间的一个更重要的区别是,当bash扩展*时,它将跳过以.开头的文件名,例如.gitignore本身。因此,如果您要添加所有内容,则使用.(或类似:/:.之类的内容以确保您正在谈论工作树根目录)通常是更正确的命令。

答案 1 :(得分:0)

您正在通过同一命令运行两个不同的动作,而这里最关键的是filename expansion。我的仓库有一个非常标准的根目录;

$ ls
db/  docs/  packages/  reports/  scripts/  src/

$ ls .
db/  docs/  packages/  reports/  scripts/  src/

到目前为止一切明智。

$ ls * | head
db:
Company.Data.Migrations/

docs:
ProjectX/
wiki/

packages:
Company.ProjectA.1.0.1/
Company.ProjectB.1.0.17/
... # and so on for every file

所以行为在ls .ls *之间改变,为什么?请参阅here以获得有关帮助扩展文件名的技巧。

$ echo ls .
ls .

$ echo ls *
ls db docs packages reports scripts src

所以bash用{em>当前目录中的所有内容代替了*,这就是我们的意思。 ls的行为与git add相似,这取决于您是否指定.表示当前目录,还是指定*表示此目录中的每个文件。