2017-02-03 9 views
4

Gitリポジトリで2か月間修正されていないcppソースファイルなど、過去の特定の日付より古いファイルを検索しようとしています。Gitリポジトリの特定の日付より古いファイルを見つける

Linuxのfindシェルコマンドを使用している場合、私のワークスペースのファイルは "git sync"された日付でマークされているため、シェルコマンドを見つけることができません。

どうすればいいですか?

答えて

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月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に引数としてファイル拡張子を渡すためにどのように?たとえば、myscript.sh "2017-01-01" "cpp、c"(CおよびC++ソースのみ)。 – electro

+0

@electroもう一度私の答えを更新しました。 –

+0

ありがとうございます。 ".cpp $"でスクリプトを呼び出すと、シェル上で不正な変数名エラーが発生するようです。私は$記号だと思う。 – electro