我对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错误的警告,还是有合理的解释?
答案 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
相似,这取决于您是否指定.
表示当前目录,还是指定*
表示此目录中的每个文件。