2012-08-15 60 views
7

我想添加一個具有唯一文件名但文件名較長的文件(例如a/b/c/d/filename.java)。通常我會通過做使用兩個星號在git中添加文件

git add *filename.java將其添加到我的存儲庫。

不過我也這樣做過:

git add a/b/c/d/filename*

於是,我就結合兩種:

git add *filename*

但是這確實很奇怪。它添加了每個未跟蹤的文件。我可以看到失敗的可能原因,但他們都應該發生在前兩個命令之一中,所以我不知道爲什麼會發生這種情況。

我的問題不是關於如何添加文件到一個只有文件名的git存儲庫(儘管這會很有用)。 我的問題是我對*操作的誤解,這讓我覺得上面應該可以工作。

信息:

我使用Git Bash for Windows,這是基於minGW

+0

是你使用的文件名實際上是字符串'filename'還是你用它作爲例子? – Hogan 2012-08-15 11:51:32

+0

這只是一個例子。 – Paul 2012-08-15 11:54:16

+0

如果你指的是最後一條命令,那麼這不是正在發生的事情。事實上,我認爲相反的事情發生了:它匹配一切。如果我輸入'git add',則不會添加任何內容。 – Paul 2012-08-15 11:58:46

回答

9

您正在查看globs (不是正則表達式,它們是不同的模式匹配語言),它們由shell而不是git擴展。

如果你想看看他們將如何匹配,只需將相同的glob傳遞給另一個命令,例如。

$ ls -d *filename.java 

VS

$ ls -d *filename* 

(我剛剛加入-d所以LS不顯示任何匹配目錄的內容)


由於您使用的git bash,並且glob擴展的行爲可能與常規shell不同,請嘗試

$ git add --dry-run --verbose -- *filename* 

例如:這應該告訴你它是如何真正擴展glob併產生什麼效果。

注意-- ...如果你使用的是水珠可能一個文件名以領先-匹配,以確保git的知道這是一個文件名,而不是一種選擇是非常重要的。

不幸的是,這將只顯示兩個文件都與glob匹配,並且在索引和工作副本之間有一些差異。從筆者


答: 空運行幫了不少忙,這裏是我發現:

我忘記了,我還沒有添加bin文件夾,所以當我執行幹運行我意識到它找到兩個匹配:filename.java和filename.class。當我將glob更改爲*filename.j*時,它工作正常。

我的下一步是去除.class並再次嘗試命令:它的工作!它仍然無法解釋,爲什麼git bash在找到兩場比賽時添加了所有內容...由於空運行爲與實際運行行爲不同,我認爲必須有一個bug,但我認爲討論將在其他地方舉行(除非有人認爲它不是一個錯誤)。

+0

有趣的是,這給了我不同的結果。那麼這是否意味着Git正在評估它? – Paul 2012-08-15 11:57:20

+0

Git無法評估它,Globing發生在Git運行之前(在我知道的所有shell中) – Hogan 2012-08-15 11:58:35

+0

這可能是問題所在:我使用的是Git Bash,它是Windows的Git shell(我認爲它使用minGW)。我會將其添加到我的第一篇文章中。 – Paul 2012-08-15 12:00:40