2016-08-22 43 views
2

在bash腳本中,我想知道目錄中是否有未分期的文件。Git plumbing - 快速查找目錄中是否有任何未分期的文件

最接近我可以得到的是檢查這個退出代碼:

git ls-files --other --error-unmatch --exclude-standard --directory "$folder/" > /dev/null 2>&1 

有2個缺點。

  1. 我必須使用不同的命令來檢查文件是否未分級
  2. 這將所有的文件打印到/dev/null退出之前,這可能需要很長的時間在某些回購
  3. (因爲斜線)

理想情況下,我想讓它儘快停止,因爲它發現未追蹤文件的方式 - 我並不需要知道它們是什麼,只是如果他們有

回答

2

如果」用git命令重新開心,你可以管到grep -q,wh OSE返回代碼會告訴你,如果有任何輸出:

git ls-files --other --exclude-standard --directory "$folder/" | grep -q . 

只要grep的接收任何輸入,模式.匹配,它成功地退出。

要抑制錯誤輸出,可以將整個事件包裝在花括號{ }中,並將2>/dev/null添加到最後。

另一種選擇是解析git status的輸出。例如,要查看是否在輸出中的任何文件都開始$directory的路徑,你可以這樣做:

git status --porcelain | awk -v dir="$dir" 'index($2, dir) == 1 { found = 1; exit } END { exit !found }' 

如果你的版本的awk支持設置的記錄分隔符爲空字節,你可以使用git status -z代替:

git status -z | awk -v RS='\0' -v dir="$dir" 'index($2, dir) == 1 { found = 1; exit } END { exit !found }' 

要篩選出未跟蹤文件,你可以添加對`$ 1 =檢查 「??」:

git status -z | awk -v RS='\0' -v dir="$dir" '$1 != "??" && index($2, dir) == 1 { found = 1; exit } END { exit !found }' 
+0

是的,對於'sed 1 q'同樣如此,但即使管道程序退出腳本也不會繼續,直到原始命令結束。你可以這樣測試:'(echo -e「test \ ntest」&& sleep 5s)| grep -q .' –

+0

我不確定你的測試是否一樣 - 也許更好的例子是'find。 | grep -q .'在一個包含大量文件的目錄中。該程序幾乎立即退出,然而如果沒有grep管道,花費很長時間。 –

+0

你說得對 - 我應該認爲這與緩衝有關。這就是說:如果需要很長時間才能找到有問題的文件,它仍然會掛起,直到它通過整個目錄結構,所以這仍然不理想。理想將是一個專門的管道命令或東西 –

0

不知道這是快或慢,但git clean -n會列出未保存的文件。

這並不能解決「找到第一個非分頁文件時立即停止」的問題,但似乎沒有好的辦法做到這一點。

相關問題