2010-05-24 95 views
7

我有一個骯髒的工作樹,髒,因爲我對源文件進行了更改,並觸及了一些圖像。我試圖只將圖像添加到索引,所以我跑了這個命令:Git添加無法使用.png文件?

git add *.png 

但是,這不會添加文件。有幾個新的圖像文件被添加,但沒有被修改/預先存在的被添加。

什麼給?

編輯:下面是一些有關的終端輸出

$ git status 
# On branch master 
# 
# Changed but not updated: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: src/main/java/net/plugins/analysis/FormMatcher.java 
# modified: src/main/resources/icons/doctor_edit_male.png 
# modified: src/main/resources/icons/doctor_female.png 
# 
# Untracked files: 
# (use "git add <file>..." to include in what will be committed) 
# 
# src/main/resources/icons/arrow_up.png 
# src/main/resources/icons/bullet_arrow_down.png 
# src/main/resources/icons/bullet_arrow_up.png 
no changes added to commit (use "git add" and/or "git commit -a") 

然後執行 「GIT中添加* .PNG」(沒有命令後輸出)

然後:

$ git status 
# On branch master 
# 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# new file: src/main/resources/icons/arrow_up.png 
# new file: src/main/resources/icons/bullet_arrow_down.png 
# new file: src/main/resources/icons/bullet_arrow_up.png 
# 
# Changed but not updated: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: src/main/java/net/plugins/analysis/FormMatcher.java 
# modified: src/main/resources/icons/doctor_edit_female.png 
# modified: src/main/resources/icons/doctor_edit_male.png 
+1

怪異:/你能給出一些信息呢?來自'git status'的摘錄或其他內容? – 2010-05-24 20:01:02

+0

他們沒有出現在「git commit -a」屏幕上,對嗎? – 2010-05-24 20:02:18

+2

您確定通配符與您希望添加的已修改文件相匹配嗎? (簡單測試:'ls * .png'顯示它們嗎?) – Cascabel 2010-05-24 20:07:01

回答

15

邁克爾Mrozek的評論基本上是答案。 *.png與當前目錄中的該名稱的文件相匹配,而不是在子目錄中。如果你想在子目錄中添加的,這樣做的:

git add src/main/resources/icons/*.png 

,或者取決於你的shell,你可以這樣做:

git add **/*.png 

的一點是,它是做殼globbing(將* .png擴展爲文件名列表)。 Git與此無關;它只需要shell給出的參數。編輯:由於這設法得到接受,我應該繼續和其他人一樣指出,一些git命令在內部支持globbing(通過fnmatch),所以如果引用glob模式,它會通過未修改的方式傳遞通過外殼混合,在哪裏進行globbing擴展。

+1

良好的漁獲物。+1。我有看到每個操作系統都有所不同的基礎'fnname()'方法的奇怪事情:請參閱示例:http://stackoverflow.com/questions/2330471/gitignore-does-not-understand-my-folder-wildcard-on-windows和http://stackoverflow.com/questions/1470572/ – VonC 2010-05-24 20:44:02

1

在懷疑,請嘗試:

git -A -- *.png 

,這可能是更全面(git add man page

-A 
--all 

-u,但比賽<filepattern>針對除索引工作樹中的文件。
這意味着它會找到新文件以及暫存已修改的內容並刪除不再在工作樹中的文件。

看到如此問題 「Difference of 「git add -A」 and 「git add .

+0

嘗試過,但沒有奏效:( – DLaw 2010-05-24 20:13:52

10

一些Git的命令(包括git add)可以自己處理文件名模式。但首先你必須確保模式到達Git。

一般來說,未加引號的模式可能不會使其被調用的命令。作爲特殊情況,如果模式不匹配任何文件(如果模式中沒有斜線,則在當前目錄中),bash會將未擴展模式傳遞給命令(除非設置了nullglob選項,在這種情況下,模式參數將從傳遞給命令的參數中刪除)。但是這種行爲在不同的炮彈之間有所不同默認情況下,zsh會發出「找不到匹配項」的錯誤,除非nomatch選項未設置(將未擴展模式作爲參數傳遞)或設置了null_glob選項(從參數列表中刪除模式)。

因此,使用不帶引號的模式並期望它們進入基礎命令只有在知道shell的行爲並且知道模式中指定的任何目錄的內容時纔可靠(通常只是模式的當前目錄削減)。

因此,爲了獲得最大的可靠性,如果您希望git add將文字字符串*.png作爲參數,那麼您應該引用它。

git add \*.png 
git add "*.png" 
git add '*'.png 
# etc. 

一旦你已經成功地通過一個文件名模式的Git,你會遇到來自殼如何處理他們的一些差異。

這個問題的主要區別在於匹配是由fnmatch(3)完成的,沒有 FNM_PATHNAME集。這意味着像*.png這樣的模式將匹配當前目錄中的文件foo.png(就像一個shell),但它也將匹配dir/bar.png(因爲沒有FNM_PATHNAME,*可以與斜槓匹配)。 Git將其模式「pathspecs」稱爲區分它們與shell「glob」模式。

不幸的是,git add處理pathspecs的方式存在不一致。它總是將它們應用於未跟蹤的文件,但它永遠不會將它們應用於跟蹤文件(相反,像pathspecs這樣的文件名類型參數僅針對跟蹤文件列表的完全匹配進行檢查)。這顯然正是OP實際遇到的情況,因爲它會添加新的與pathspec匹配的文件,但無法更新(已經)跟蹤與pathspec匹配的文件。

只要您的shell支持**擴展模式(或等效模式),Jefromi的解決方法(git add **/*.png)就可以工作。

你實際上可以讓Git做這項工作,但使用shell可能更容易(如果你的shell支持的話)。

# update all tracked files matching the Git pathspec *.png 
git ls-files --cached -z \*.png | git update-index --add -z --stdin 

理順Git的內部pathspec處理是一個「中期」目標,卻沒有一個任何人有時間,興趣和相關經驗上前修復。

它被帶到了一個project idea for Google Summer of Code 2010(而不是由任何人拿起),以及相關問題在一段時間拿出郵件列表上一次(在一月份,又在2010年3月有人舉報a symptom much like the OP'sGit's maintainer explained what he would like to see in the long term)。

+0

+1,比我的答案更完整。 – Cascabel 2010-05-25 13:32:18

0

不區分大小寫的文件系統,如Mac OS X的默認設置也會造成嚴重破壞。如果將'directory'改爲'Directory',除非移動到另一個臨時文件夾,否則不會讓git識別它,提交,回退並再次提交。

0

git ls-files是列出一切在你的git回購

對於你的情況,你可以這樣做

git ls-files --modified | grep '\.png$' | xargs git add 

列表中的修改文件,過濾器而廣之的好方法(在這種情況下,.png格式)和Git增加所產生的條目