2013-04-10 26 views
10

要求在命令git ls-files --ignored中使用排除模式的邏輯是什麼?爲什麼git ls-files --ignore需要排除模式?

git help ls-files:在輸出

-i, --ignored

只顯示忽略的文件。在索引中顯示文件時,只打印排除模式匹配的文件。顯示「其他」文件時,只顯示與排除模式匹配的文件。

+0

你的意思是需要指定'--exclude-standard'(或類似的)? – 2013-04-10 12:01:06

回答

13

首先讓我確保你不會混淆--ignored和​​。

​​是您列出未跟蹤文件的選項。從git-ls-files(重點煤礦)的手冊:

-o, --others

顯示其他(即未跟蹤)文件輸出

這就是說,讓我們看看--ignored一樣。無論您列出的是什麼,無論是跟蹤文件,未跟蹤文件,已修改文件等,您都可以從輸出中排除某些文件。把它想象成在輸出上自動完成的免費grep -v。例如:

git ls-files --other --exclude=*.o 

會列出不匹配*.o所有未跟蹤文件。排除模式與.gitignore無關。的確,.gitignore決定了​​會輸出什麼,而--exclude在列表完成後過濾輸出(或者至少這是觀察到的行爲)。

現在--ignored只是恢復輸出。所以exclude=的排除內容將被打印出來,而不被排除的內容將被省略。因此,例如:

git ls-files --other --exclude=*.o --ignored 

將打印所有未跟蹤文件比賽*.o

不完全一樣,只--exclude過濾未經跟蹤文件,所以如果你是列出了跟蹤文件,--exclude不會排除任何事情。但是,--ignored會列出應該排除的文件。這有點奇怪。

結論:--ignored基本上會恢復命令行中給出的排除模式。默認情況下,排除模式爲空(您可以看到所有內容),因此--ignored沒有任何排除模式會導致所有被省略。這是無用的,這就是爲什麼--ignored需要排除模式才能工作的原因。


由於--exclude-standard被提及,我也想對此進行擴展。 --exclude-standard也會在列表中添加被忽略的模式(例如寫入.gitignore)作爲排除模式。所以想想下面的命令:

git ls-files --ignored --exclude-standard 

首先,這個命令列出了所有的跟蹤文件。然後給出--ignored命令,它將只打印與排除模式匹配的文件。給定--exclude-standard,將會打印與.gitignore中的模式匹配的文件。但那些是你保持不跟蹤的文件。如此有效,你什麼都看不到。 看到的唯一情況是,如果您正在跟蹤在.gitignore中您也提到過要忽略的文件。

換句話說,如果該命令輸出任何內容,這意味着你已經告訴git忽略某些文件,但是你違反了你自己的規則,並將它們添加到存儲庫。


其他有趣的命令可能是:

git ls-files --other --exclude-standard 

顯示您未在指定.gitignore所有未跟蹤文件。您還會在git status中看到這些文件。

git ls-files --other --ignored --exclude-standard 

顯示您成功設法忽略的所有未跟蹤文件,其中包括.gitignore。換句話說,(假設前面的查詢是空的,即沒有未經過簽名的未跟蹤文件),它將顯示當前目錄中不屬於存儲庫的所有文件。這對檢查不應該被忽略的文件很有用,並且必須放入存儲庫。

相關問題