2017-02-03 57 views
4

我正在嘗試查找比以前某些日期早的文件,例如,在Git存儲庫中未修改爲2個月的cpp源文件。在Git存儲庫中查找超過特定日期的文件

如果我使用的是Linux find shell命令,我將無法找到它,因爲我的工作區中的文件標記爲「git sync」-ed的日期。

我該怎麼做?

回答

4

首先我們需要找到目前在回購中的文件。這很簡單:

git ls-files 

對於每個這些文件,我們想看看它是否在指定日期之後被修改。 git log將在這裏工作:

git log --since "<some date>" -- somefile.cpp 

(這會給沒有輸出,如果該文件還沒有被指定的日期進行修改。)

與用戶友好的輸出另一個git log命令全部放在一起,這裏有一個腳本,應該做的工作:

#!/bin/bash 

date=$1 
git ls-files | while read path 
do 
    if [ "$(git log --since \"$date\" -- $path)" == "" ] 
    then 
    echo "$path $(git log -1 --pretty='%h %ad' -- $path)" 
    fi 
done 

用法:

/path/to/myscript.sh "2017-01-01 12:00" 

這將顯示只有尚未從中午1月1日之前修改過的文件,2017年

這猛砸,所以當然你可以凝結下來到一個行:

git ls-files | while read path; do if [ "$(git log --since \"$1\" -- $path)" == "" ]; then echo "$path $(git log -1 --pretty='%h %ad' -- $path)"; fi done 

爲了限制的結果,某些類型的文件,在中間增加一個grep命令,就像這樣:

git ls-files | grep -e ".cpp$" -e ".h$" -e ".c$" | while read path; ... 

這裏有一個已經可以讓您通過這些文件類型作爲參數上面的腳本的rsion:

#!/bin/bash 

date=$1 
grepargs="" 
shift 
while [ $? -eq 0 ] 
do 
    grepargs="$grepargs -e \"$1\"" 
    shift 
done 
git ls-files | grep $grepargs | while read path 
do 
    if [ "$(git log --since \"$date\" -- $path)" == "" ] 
    then 
    echo "$path $(git log -1 --pretty='%h %ad' -- $path)" 
    fi 
done 

用法:

/path/to/myscript.sh "2017-01-01 12:00" ".cpp$" ".h$" ".c$" 
+0

如何通過文件擴展名在bash myscript.sh說法?例如,僅用於C和C++源的myscript.sh「2017-01-01」「cpp,c」。 – electro

+0

@electro再次更新我的答案。 –

+0

謝謝。用「.cpp $」調用腳本似乎會在shell上觸發非法的變量名稱錯誤。我認爲這是美元符號。 – electro

相關問題