2010-11-10 106 views
6

將「git add」與文件模式一起使用時,它只會遞歸添加未跟蹤的文件,並忽略已更改的文件,除非它們位於當前文件夾中。這是git的「git add」子文件夾的正確行爲?

實施例:

$ 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: level1/test1.txt 
#  modified: level1/level2/test1.txt 
# 
# Untracked files: 
# (use "git add <file>..." to incldude in what will be committed) 
# 
#  level1/test2.txt 
#  level1/level2/test2.txt 
no changes added to commit (use "git add" and/or "git commit -a") 
$ git add level1\*.txt 
$ git status 
# On branch master 
# Changes to be committed: 
#  new file: level1/level2/test2.txt 
#  new file: level1/test2.txt 
# 
# Changed but not updated: 
#  modified: level1/level2/test1.txt 
#  modified: level1/test1.txt 
# 

我執行git add level1\*.txt後,將未跟蹤(的test2.txt)文件被添加,而不是修改(test1.txt的)文件。我已經嘗試使用-u選項,轉義和不轉義星號等,但似乎無法簡單地添加匹配模式的所有文件,無論它們是否被跟蹤。

當然在這個例子中,我可以用-A添加所有文件,但請記住這僅僅是爲了這個問題的目的,實際上會有更多的文件,我不想將它們全部添加,並且層次結構是更深的幾個文件夾。我添加跟蹤文件的唯一方法是引導或寫入整個模式,但文件名除外:git add level1**.txtgit add level1/level2/*.txt

在git add文檔中:here它表示文件模式應該遞歸工作,並且不會說跟蹤或未跟蹤文件的任何內容,它甚至會給出和示例。

我使用的是msysgit,但我已經在Windows和Linux上測試過以防萬一。

我只是想知道。我是否正確地解釋了文檔(因爲我認爲它基於文檔應該起作用)還是應該如何工作?這對我來說沒有意義。

+0

除非我誤解你的設置或問題,我不能重現這在所有。我將自己設置爲從你的git狀態獲得輸出,然後運行'git add level1/*。txt',並且如所期望的那樣,添加了level1/test1.txt和level1/test2.txt(一個修改,一個新文件),但不是level2中的兩個文件。 (你期望它匹配level2中的文件嗎?'*'在目錄中不起作用。) – Cascabel 2010-11-10 15:39:05

+2

好的,我相信我找到了你的意思。如果我運行'git add「level1/*。txt」'(引號引起'*'由git處理,而不是由shell處理),我得到你的行爲:添加test2文件(新) test1(修改)。有趣。 (我第一次誤解了這個 - 認爲'\'應該是windows目錄分隔符,我不使用msysgit。) – Cascabel 2010-11-10 15:42:16

+0

(呃,在之前的評論中,'\'應該是'\\ ')。我已經編輯了這個問題,以自己的方式再現這個例子之後,這個例子會更清楚一些。如果我弄亂了任何東西(特別是與目錄分隔符和反斜槓轉義有關),請修復它! – Cascabel 2010-11-10 15:53:59

回答

1

好的,在這個問題上可能還有答案。

不,這似乎不是正確的行爲。 git add <filepattern>應等於git add file1 file2...,其中那些是與模式匹配的文件 - 而這不是在這裏發生的。

0

這是因爲你用

git add level1\*.txt 

Notes中的反斜槓\。這等於

git add 'level1*.txt' 

要獲得預期的行爲,利用斜線/

如果你只是要添加的所有文件,使用git add -A .

+0

作爲一個相當有經驗的git用戶,我會說這仍然是意想不到的行爲。 – 2010-11-11 09:40:59

+0

使用「git add level1/*。txt」,您將在level1文件夾中添加以「.txt」結尾的所有文件,但不會在level2的子文件夾中添加。我知道你可以用「git add -A」添加所有的文件,但這不是重點,我們希望按照預期工作(以匹配具有模式的所有文件...)。 – bluediapente 2010-11-11 14:14:15