2014-09-25 174 views
65

我是新來的混帳,我有一個關於在git中添加文件的問題。我發現了多個有關git add .git add -a,git add --all,git add -A等之間差異的計算器問題。但是我一直無法找到解釋git add *的作用的地方。我甚至看過git add man page,但它沒有幫助。我一直在用它代替git add .,我的同事問我爲什麼。我沒有答案。我一直使用git add *git add *(星號)vs git add。 (期)

git add .git add *一樣嗎?是否僅從當前目錄添加更改的文件,而另一個是從當前目錄和子目錄(遞歸地)添加文件?

有上顯示git add -Agit add .git add -u之間的差異等問題疊一個上市一個偉大的圖表,但它沒有git add *

enter image description here

注:我知道這意味着什麼使用星號作爲通配符(添加具有給定擴展名的文件)。例如,git add *.html將添加擴展名爲.html的所有文件(但忽略.css.js等)。

感謝您的幫助!

+1

圖表從哪裏來?我剛剛嘗試過'git add .',並且它演示了一個刪除的文件沒有問題,不像那個行中的'X'。 – David 2015-08-05 16:27:35

+0

@David該圖像來自[此回答](http://stackoverflow.com/a/26039014/1270168)並適用於舊版本的git。 – jerry 2016-07-21 17:52:55

+2

圖片已過時! Git 2.x是不同的:https://i.stack.imgur.com/KwOLu.jpg – 2017-05-11 10:08:26

回答

63

add *表示添加當前目錄中的所有文件,名稱以點開頭的文件除外。這是你的shell功能,Git只收到文件列表。

add .在shell中沒有特別的含義,因此Git遞歸地添加了整個目錄,這幾乎是相同的,但包括名稱以點開頭的文件。

+3

'git add .'添加所有文件,文件夾和子文件夾,包括.gitignore和其他任何以點開頭的內容,而'git add *'會添加任何文件,文件夾和子文件夾,但以點開頭的文件,文件夾和子文件夾除外?這是否準確? – Tyler 2014-09-25 16:24:44

+5

這確實是正確的。另外,'git add *'仍然會添加以點開頭的文件,如果它們在子目錄中的話。 – Denis 2014-09-25 16:42:55

+1

'git add .'也尊重.gitignore,而'git add *'如果任何非點文件都是gitignored,將會拋出一個錯誤。使用'git add .'比'git add *'更好。 – rosuav 2016-07-18 22:26:26

12

*不是git的一部分 - 它是由shell解釋的通配符。 *擴展到當前目錄中的所有文件,然後只傳遞給git,它們都是add.是當前目錄本身,它會添加它以及它下面的所有文件。

+0

那麼每個人都有一個理由使用星號?使用它而不是一段時間有什麼好處?或相反亦然?我確定我在教程中看到了它。否則我不會知道使用它。我不是一個命令行傢伙(正如你無疑猜到的)。 – Tyler 2014-09-25 16:26:22

+2

'*'避免隱藏文件(即其名稱以'.'開頭的文件)。無論如何,如果你沒有添加特定的文件,我只需要使用'git add -u'(或者如果你正在創建新文件,則使用'git add -A')。 – Mureinik 2014-09-25 16:49:36

+0

由於你們都回答了我的問題,所以我很難決定給誰信用。我選擇丹尼斯是因爲他的代表比你低。所以我想給他綠色的支票會讓他受益多於對你有益的。我希望這是有道理的?但我很欣賞這兩個解釋。謝謝! – Tyler 2014-09-25 19:04:23

4

在shell中使用點.通常表示「當前目錄」。

當您在shell上使用星號*時,將使用名爲file-globbing的功能。例如。在bash上功能​​3210就是這樣做的。爲水珠的手冊頁(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 *會觸發文件通配,並且會擴展到所有不以點開頭的文件和目錄。