如果有如下的目錄結構:
workspace tree
|
---------------------
| |
hello.c d
hello.o |
.gitignore say.c
say.o
.gitignore
在workspace tree的跟目錄下有3個文件hello.c,hello.o,.gitignore以及一個文件夾d,其中根目錄下的.gitignore文件忽略.o文件。在文件夾d下也有3個文件,say.c, say.o,.gitignore,其中文件夾d下的.gitignore不忽略.o文件。hello.o和say.o都是剛剛編譯出來的文件。此時,如果在根目錄下運行
git add *
則會報錯:
The following paths are ignored by one of your .gitignore files: hello.o Use -f if you really want to add them fatal:no files add
而如果運行:
git add \*
則可以將d/say.o成功的添加到index中。
通過git add --help查詢發現:
1) git add 后面跟的文件有被忽略的文件,那么操作失敗;
2) git add 通過遍歷目錄遇到了要被忽略的文件,此文件不會被加入到index
3) git add 遇到由git展開glob(不是由shell展開)形成的要被忽略的文件,此文件不會被加入到index
因此,在上面的情形中,直接運行git add *是進行的shell 展開glob,此時相當於運行git add hello.o(由於shell 展開glob無法cross目錄,因此沒有匹配d/say.o),而hello.o是要被忽略的文件,所以操作失敗;如果運行git add \*,\*由git展開,可以匹配hello.o,d/say.o,根據上面的原則3),hello.o不會被加入到index中,因此此時相當於運行git add d/say.o,所以操作得以正確進行。