Как распечатать последнюю информацию о фиксации для каждого файла в репозитории git

У меня есть script, который копирует некоторые файлы из репозитория git на удаленном сервере. Для каждого файла, который скопирован, если он находится под управлением версией, я хочу сгенерировать строку, например:

Filename: <filename>, commit: <last-commit-hash>, date: <date of last commit>

Идея состоит в том, чтобы хранить эти строки в файле и копировать его также на удаленном сервере. Таким образом, я всегда могу узнать, какой файл на сервере принадлежит коммиту в моем репозитории git. Есть ли быстрый способ сделать это?

Ответ 1

Я сомневаюсь в том, насколько это полезно, поскольку вы всегда можете получить информацию из локального репозитория или через gitweb, но здесь вы:

git ls-files | while read file; do git log -n 1 --pretty="Filename: $file, commit: %h, date: %ad" -- $file; done

%h дает сокращенный хеш; если вы хотите использовать полный, используйте %h. Вы также можете играть в формате даты с помощью --date=local|iso|rfc|short (см. git -log manpage).

Ответ 2

Я поговорил об этом на #git с несколькими парнями, и один из них (спасибо Микачу) нашел этот Perl-скрипт, у которого был правильный алгоритм, но были серьезные недостатки реализации.

Поэтому я исправил проблемы с этим сценарием, много прибрал, и вот результат (скачать с здесь). Обратите внимание, что в настоящее время для запуска требуется Term::ANSIColor. здесь вы можете увидеть скриншот в действии:

screenshot of git-ls-dir runs
(источник: adamspiers.org)

Надеюсь, это поможет!

Ответ 3

Это быстрее и может быть отсортировано по возрасту:

find <dir> -exec git log -n 1 --pretty="%ai {}" "{}" \; | sort -r

Ответ 4

На основе ответа @Cascabel:

git ls-files | while read file; do git log -n 1 --pretty="$file       %h      %ar     %s" -- $file; done | column -t -s '     '

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

so_cv_moment.py               f6988e4  11 months ago  Miscellaneous changes
so_cyclic_sequence_reset.py   0f2ddc6  10 months ago  Added more SO answers
so_distinct_sequence.py       fc7365d  6 months ago   Speed up attempt (fail)
so_fft_gaussian.py            0fb7605  7 months ago   Stack Overflow answer: FFT gaussian
so_flat_dict.py               6b25e5d  12 months ago  Moved into py directory
so_flatten_list_perftools.py  7e4bfc8  5 months ago   Performance tests for list flatten
so_iterator_cycle.py          3530018  5 months ago   asyncio; stackoverflow iterator