4
我正在嘗試查找比以前某些日期早的文件,例如,在Git存儲庫中未修改爲2個月的cpp源文件。在Git存儲庫中查找超過特定日期的文件
如果我使用的是Linux find
shell命令,我將無法找到它,因爲我的工作區中的文件標記爲「git sync」-ed的日期。
我該怎麼做?
我正在嘗試查找比以前某些日期早的文件,例如,在Git存儲庫中未修改爲2個月的cpp源文件。在Git存儲庫中查找超過特定日期的文件
如果我使用的是Linux find
shell命令,我將無法找到它,因爲我的工作區中的文件標記爲「git sync」-ed的日期。
我該怎麼做?
首先我們需要找到目前在回購中的文件。這很簡單:
git ls-files
對於每個這些文件,我們想看看它是否在指定日期之後被修改。 git log
將在這裏工作:
git log --since "<some date>" -- somefile.cpp
(這會給沒有輸出,如果該文件還沒有被指定的日期進行修改。)
與用戶友好的輸出另一個git log
命令全部放在一起,這裏有一個bash腳本,應該做的工作:
#!/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$"
如何通過文件擴展名在bash myscript.sh說法?例如,僅用於C和C++源的myscript.sh「2017-01-01」「cpp,c」。 – electro
@electro再次更新我的答案。 –
謝謝。用「.cpp $」調用腳本似乎會在shell上觸發非法的變量名稱錯誤。我認爲這是美元符號。 – electro