Вопрос по github, git – Как я могу увидеть дату создания нескольких файлов в git?

13

Я хочу видеть дату создания git (дату первого коммита, где они были добавлены) всех файлов в указанном каталоге.

Кроме того, мой предыдущий комментарий больше не применяется. Понятно, полвоазулhad tried something. David Cain
Дата коммита находится внутри самого дерева Git. Если вы попытаетесьgit log Вы можете увидеть дату всех прошлых коммитов. Это само по себе является хорошей отправной точкой, есть много, что можно попробовать. David Cain
@ Дэвид: я не думаю, что есть что-то, кроме нажатия кнопок в веб-интерфейсе GitHub. Я также не вижу никаких кнопок для этого. Blender

Ваш Ответ

2   ответа
26

Я разобью свое решение на шаги.

Get a list of all files in the repository
$ git ls-files

Это возвращает список относительных путей всех файлов в хранилище.

Get the SHA-1 of the first commit of a given file:
$ git rev-list HEAD <file> | tail -n 1

Это вернет список всех фиксаций без родителей для данного файла в обратном хронологическом порядке. Последний является хешем SHA-1 первого коммита для данного файла.

Вы можете проверить это, запустивgit log --raw <hash>, Вы должны увидеть что-то вроде:

commit <commit_hash>
Author: Susy Q <[email protected]>
Date:   Wed Aug 24 12:36:34 2011 -0400

    Add new module 'example.py'

:000000 100644 0000000... <hash>... A  example.py
Show the date of a given commit
$ git show -s --format="%ci" <hash>
Bringing it all together in a bash script:
#!/bin/bash
for file in $(git ls-files)
do
    HASH=$(git rev-list HEAD "$file" | tail -n 1)
    DATE=$(git show -s --format="%ci" $HASH --)
    printf "%-35s %s\n  %s\n" "$file" $HASH: "$DATE"
done
Хорошие команды git там, которые я не слышал раньше! Спасибо! polvoazul
Должна ли быть возможность сортировать по дате?
Очень круто! NB. Если в именах файлов или путях есть пробелы, добавьте следующее в начало сценария, передfor заявление:IFS=$(echo -en "\n\b") (отcyberciti.biz/tips/handling-filenames-with-spaces-in-bash.html)
2

for file in dir/*; do echo -e "$file: \t\t `git log $file|grep Date|tail -1`"; done

это работает, запустивgit log на каждом файле, а затемgrepв нем, чтобы получить только даты каждого коммита относительно этого файла. затемtail -1 гарантирует, что я получу только дату первого коммита.echo -e "..." есть ли просто так, чтобы он печатал информацию (не очень) дружественным образом!

Каким бы блестящим ни было ваше решение, не стоит использоватьgit log для сценариев. знак равно
Еще лучше форматировать с помощью printf:for i in *; do printf "%-35s `git log $i|grep Date|tail -1`\n" $i:; done polvoazul
@ Дэвид Можете ли вы сказать мне, почему?not intended to sound arrogant :) polvoazul
Por supuesto (у тебя нет проблем!).git log создает много постороннего текста, который вам не нужен, и может вызвать проблемы с регулярным выражением. Например, что произойдет, если & quot; Дата & quot; в вашем последнем коммите? Git имеет целый набор инструментов, предназначенных для взаимодействия с деревом ревизий. Вы должны использовать эти инструменты вместо этого.
Для справки, если вы добавили символ BOL (^) к вашему регулярному выражению, как это сделал Johnsyweb, ваше регулярное выражение будет перехватывать только строки с истинной датой (сообщения о коммитах с отступом).

Похожие вопросы