Вопрос: Как получить последнюю дату изменения всех файлов в репозитории git


Я знаю, как получить последнюю дату изменения одного файла в репозитории git:

git log -1 --format="%ad" -- path/to/file

Есть ли простой и эффективный способ сделать то же самое для всех файлов, имеющихся в настоящее время в репозитории?


46
2018-06-22 19:41


Источник




Ответы:


Простым ответом было бы итерацию каждого файла и отображение времени его модификации, то есть:

git ls-tree -r --name-only HEAD | while read filename; do
  echo "$(git log -1 --format="%ad" -- $filename) $filename"
done

Это даст выход так:

Fri Dec 23 19:01:01 2011 +0000 Config
Fri Dec 23 19:01:01 2011 +0000 Makefile

Очевидно, вы можете контролировать это, так как это просто скрипт bash на данный момент - так что не стесняйтесь настраивать содержимое вашего сердца!


57
2018-06-22 20:10



Я надеялся, что есть возможность получить комбинированный результат в одном запуске git log, но ваш ответ лучше, чем тот, который я имел в виду, используя find. Я не знал git-ls-tree, у которого есть преимущество перечислять только файлы, хранящиеся в репозитории, пропуская папку .git и игнорируемые файлы. Благодарю. - Eric Bréchemier
Нет проблем, Эрик; вы следуете тому же маршруту, что и я, т. е. выполняя поиск и игнорируя каталог .git! :) Могут быть некоторые варианты, используя команды git plumbing, но, откровенно говоря, это работает очень хорошо. Если бы вы могли найти способ получить информацию на основе каждого файла сразу, это будет работать лучше всего, но помните, что git работает на состоянии коммитов, а не в состоянии отдельных файлов. - Andrew M.
Может ли это быть адаптировано для работы над фиксацией, отличной от текущей проверки HEAD? Я думаю, что команда log работает по отношению к HEAD по умолчанию. - ThorSummoner
Я рекомендую использовать --format = "% ai", если вы хотите сортировать отметки времени вместо человекочитаемых дат. - ThorSummoner
Поскольку «HEAD» - это просто ссылка, вы можете использовать любую ссылку, которую хотите, будь то тег, ветвь, фиксация хэша и т. Д. - Andrew M.


Этот подход также работает с именами файлов, которые содержат пробелы:

git ls-files -z | xargs -0 -n1 -I{} -- git log -1 --format="%ai {}" {}

Пример вывода:

2015-11-03 10:51:16 -0500 .gitignore
2016-03-30 11:50:05 -0400 .htaccess
2015-02-18 12:20:26 -0500 .travis.yml
2016-04-29 09:19:24 +0800 2016-01-13-Atlanta.md
2016-04-29 09:29:10 +0800 2016-03-03-Elmherst.md
2016-04-29 09:41:20 +0800 2016-03-03-Milford.md
2016-04-29 08:15:19 +0800 2016-03-06-Clayton.md
2016-04-29 01:20:01 +0800 2016-03-14-Richmond.md
2016-04-29 09:49:06 +0800 3/8/2016-Clayton.md
2015-08-26 16:19:56 -0400 404.htm
2016-03-31 11:54:19 -0400 _algorithms/acls-bradycardia-algorithm.htm
2015-12-23 17:03:51 -0500 _algorithms/acls-pulseless-arrest-algorithm-asystole.htm
2016-04-11 15:00:42 -0400 _algorithms/acls-pulseless-arrest-algorithm-pea.htm
2016-03-31 11:54:19 -0400 _algorithms/acls-secondary-survey.htm
2016-03-31 11:54:19 -0400 _algorithms/acls-suspected-stroke-algorithm.htm
2016-03-31 11:54:19 -0400 _algorithms/acls-tachycardia-algorithm-stable.htm
...

Вывод может быть отсортирован по метке времени модификации, добавив | sort к концу:

git ls-files -z | xargs -0 -n1 -I{} -- git log -1 --format="%ai {}" {} | sort

10
2018-05-03 15:35



Любой способ получить эту сортировку по метке времени модификации? - Amelio Vazquez-Reina
@ AmelioVazquez-Reina: Просто добавьте `| sort` до конца команды. - dotancohen
Это работает, но требует времени ... - Guillochon


Это небольшая подсказка от ответа Эндрю М.. (Я не смог прокомментировать его ответ.)

Оберните первое $ filename в двойные кавычки, чтобы поддерживать имена файлов со встроенными пространствами.

git ls-tree -r --name-only HEAD | while read filename; do
    echo "$(git log -1 --format="%ad" -- "$filename") $filename"
done

Пример вывода:

Tue Jun 21 11:38:43 2016 -0600 subdir/this is a filename with spaces.txt

Я ценю, что решение Эндрю (основанное на LS-дерево) работает с голой репозитариями! (Это не относится к решениям, использующим ls-файлы.)


2
2018-06-21 18:15



Вы также можете пропустить эхо: git log -1 --format = "% ad $ filename" - Kevin Lyda


Вот версия для рыбной оболочки ответа Эндрю М, для тех, кто использует рыбу.

git ls-tree -r --name-only HEAD | while read -l filename
    printf '%s %s\n' (git log -1 --format="%ai" -- $filename) $filename
end

Я храню это как функцию рыбы для легкого доступа.


0
2018-03-09 16:28