Как получить последнюю дату фиксации для кучи файлов в Git?

Какой самый простой однострочный экземпляр для получения последней даты фиксации для кучи файлов в репозитории Git (т.е. для каждого файла, дата последнего коммита, который изменил этот файл)?

Контекст для этого заключается в том, что я использую другие команды Bash для поиска длинного списка файлов, соответствующих некоторым критериям, и я хотел бы просто передать этот список в команду Git, чтобы получить последнюю фиксацию даты для каждого файла.

Ответ 1

Следующая команда будет полезна:

git log -1 --format=%cd filename.txt

Это будет печатать последнюю дату изменения для одного файла. В строке -1 отображается одна запись журнала (последняя), а --format=%cd - дата фиксации. Подробное описание параметров см. В документации для git-log.

Вы можете легко расширить это для группы файлов.

Ответ 2

Немного расширяя ответ Грега, git log может принимать несколько путей в своем аргументе. Затем он будет показывать только те коммиты, которые включали эти пути. Поэтому, чтобы получить последнюю фиксацию для группы файлов:

git log -1 --format=%cd -- fileA.txt fileB.txt fileC.txt

Я довольно мусор в сценариях оболочки, поэтому я не совсем уверен, как построить эту команду через конвейер, но, возможно, это будет хорошая тема для другого вопроса.

Ответ 3

Здесь один лайнер, использующий find (разбитый на несколько для удобства чтения, но благодаря задней обратной косой черты, copy-paste должен работать):

find <dirs...> -name '<pattern>' <any other predicate to get what you want> \
  -exec git log -1 --format="AAA%ai NNN" '{}' \; \
  -exec echo '{}' XXX \; \
| tr \\n N | sed -e 's/AAA/\n/g' | sed -e 's/NNNN/ /g' -e 's/XXX.*//g'

Слишком сложная манипуляция новой строкой с tr и sed - это просто, чтобы получить дату и имя файла на одной строке, а также игнорировать невоспроизводимые файлы. Вы должны убедиться, что ни один из ваших файлов не содержит эти глупые маркеры AAA XXX NNNN.

Ответ 4

Используйте git ls-files, чтобы найти git файлы, а затем git log, чтобы отформатировать вывод. Но поскольку git log группирует несколько файлов, когда они совместно используют одно и то же время фиксации, я предпочитаю, чтобы он обрабатывал один файл за раз, а затем сортировал результат.

Приведенный однострочник:

for f in $(git ls-files); do git --no-pager log --color -1 --date=short --pretty=format:'%C(cyan)%ai%Creset' -- $f ; echo  " $f"; done |sort -r

Если вы хотите добавить его в свой .bashrc:

function gls() {
    for f in $(git ls-files); do git --no-pager log --color -1 --date=short --pretty=format:'%C(cyan)%ai%Creset' -- $f ; echo  " $f"; done |sort -r
}

Затем запуск gls выдаст что-то вроде:

2019-09-30 11:42:40 -0400 a.c
2019-08-20 11:59:56 -0400 b.conf
2019-08-19 16:18:00 -0400 c.c
2019-08-19 16:17:51 -0400 d.pc

Результат в порядке убывания времени.