Как получить последнюю дату фиксации для кучи файлов в 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
Результат в порядке убывания времени.