2017-02-03 2 views
4

Я пытаюсь найти файлы старше определенных дат в прошлом, например исходные файлы cpp, которые не были изменены в течение 2 месяцев в репозитории Git.Поиск файлов старше определенных дат в репозитории Git

Если я использую команду оболочки Linux find, я не смогу ее найти, потому что файлы в моей рабочей области отмечены датой, когда она была «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 января 2017.

Это Bash, так что, конечно, вы могли бы конденсироваться это вниз на одну строку:

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

как передать расширения файлов в качестве аргумента в Баш myscript.sh? например, myscript.sh «2017-01-01» «cpp, c» только для источников C и C++. – electro

+0

@electro Обновлен мой ответ снова. –

+0

Спасибо. вызов сценария с «.cpp $», похоже, вызывает ошибку имени нелегальной переменной в оболочке. Я думаю, что это знак $. – electro

Смежные вопросы