Есть ли способ в git получить дату push для данного коммита? - PullRequest
79 голосов
/ 22 июля 2011

Мне интересно, есть ли способ просмотреть дату отправки, связанную с каждым коммитом в журнале git.Если это невозможно, есть ли способ увидеть все коммиты под определенным нажатием.

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

Ответы [ 8 ]

69 голосов
/ 03 октября 2012

Мне потребовалось безумно много времени, чтобы собрать разрозненную информацию и, наконец, найти самый лучший ответ на этот вопрос, но теперь я знаю, что она у меня есть. Всего две строки, без кода и без хуков:

# required for a bare repo
git config core.logAllRefUpdates true

git reflog --date=local master

Простой наконец.

Предупреждение: вы, вероятно, хотите переопределить значения по умолчанию gc.reflogExpire и gc.reflogExpireUnreachable. Проверьте git help reflog для деталей и чтобы понять, как и почему это работает.

Две вышеупомянутые команды должны быть запущены внутри клона, который вы нажимаете на . Если это невозможно, то приближение должно выполняться в другом, постоянном клоне:

git fetch               origin        # often and *regularly*
git reflog --date=local origin/master

Никогда не удаляйте этот постоянный клон, иначе вы потеряете даты.

35 голосов
/ 23 июля 2011

Git - это распределенная система контроля версий, поэтому вы должны тщательно определить, что вы подразумеваете под «датой отправки». Например, предположим, что пользователь A отправляет некоторые коммиты в репозиторий пользователя B. Через некоторое время пользователь B отправляет те же самые коммиты в третий репозиторий. Какая дата вас интересует?

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

Плохие новости

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

Хорошие новости

К счастью, в Git есть (относительно новая) функция, называемая notes . Эта функция позволяет вам прикрепить произвольный текст к коммитам, который может отображать git log. Заметки могут быть отредактированы и предоставлены другим пользователям.

Вы можете использовать функцию заметок, чтобы прикрепить сообщение «этот коммит был получен [дата]» к каждому коммиту, когда он получен общим репозиторием.

Подробнее см. git help notes.

Как записать дату

Вот подход, который я рекомендую:

  1. Измените хук post-receive в вашем общем репозитории, чтобы обходить каждый вновь доступный коммит для каждой обновленной ссылки.
  2. Для каждого коммита добавьте что-то вроде "[пользователь] из [repository_url] добавил этот коммит в [ref] в [дату]" к заметке коммита.

    Вы можете использовать ссылку на заметку, предназначенную для этой цели (например, refs/notes/received-on), вместо значения по умолчанию refs/notes/commits. Это предотвратит конфликты с заметками, созданными для других целей.

  3. Измените свой хук receive, чтобы запретить обновления ссылок на заметки (чтобы пользователи не могли случайно или преднамеренно связываться с заметками).
  4. Скажите всем пользователям запускать следующие команды из своего рабочего дерева:

    # Fetch all notes from the shared repository.
    # Assumes the shared repository remote is named 'origin'.
    git config --add remote.origin.fetch '+refs/notes/*:refs/remote-notes/origin/*'
    
    # Show all notes from the shared repository when running 'git log'
    git config --add notes.displayRef 'refs/remote-notes/origin/*'
    

    Этот шаг необходим, поскольку Git по умолчанию игнорирует ссылки, не связанные с ветвями и тегами, в исходных хранилищах.

Выше предполагается, что ссылки являются только расширенными, никогда не удаляются и не обновляются принудительно. Возможно, вы захотите, чтобы хук post-receive также добавлял примечания «удалено на [дату]» для обработки этих случаев.

6 голосов
/ 23 июля 2011

Взгляните на git reflog show master. Возможно, не тот формат, который вам нужен, но должен указывать правильное направление.

Еще одна идея - запустить скрипт внутри push-хука.

5 голосов
/ 04 февраля 2013

Этот ответ, касающийся проверки reflog на удаленном компьютере, может помочь (https://stackoverflow.com/a/8791295/336905), так как он дает вам информацию о том, какая ветвь была пропущена даже через нее, не показывает, какие коммиты были переданы, но вы можете взаимно коррелировать с помощьюпоиск следующего толчка после даты локальной фиксации. Не надежно, но удобно, если вы еще не реализовали превосходное предложение заметок от @RichardHansen, опубликованное ранее

4 голосов
/ 24 ноября 2014

Вы также можете посмотреть время изменения файла файла коммитов в каталоге "objects" в репозитории git на самом сервере.

3 голосов
/ 04 января 2018
git reflog show origin/master --pretty='%h %gd %gs %s' --date=iso

Мне кажется, это работает очень хорошо. Дата коммиттера (% cd) вводит в заблуждение, потому что она не обязательно совпадает с датой отправки. Опция --date = iso, однако выведет дату push / fetch .

Обратите внимание: если вы извлекли данные из origin / master, он напечатает дату, когда вы их получили; НЕ дата, когда кто-то еще нажал на коммит.

 - %h:  abrev. hash
 - %gd: human readable reflog selector
 - %gs: reflog subject
 - %s:  subject/commit message

Бонус: Вы можете, конечно, сделать более красивое форматирование. Пока что мне нравится эта цветовая кодировка. Это немного много, чтобы напечатать хотя. Это выведет SHA на красный, reflog селектор на cyan и reflog на зеленый.

git reflog show origin/master --pretty='format:%C(red)%h%Creset %C(cyan)%gd%Creset %C(green)%gs%Creset: %s' --date=iso
3 голосов
/ 30 декабря 2014

Почему git AuthorDate отличается от CommitDate?

  • AuthorDate - это время, когда коммит впервые был создан.
  • CommitDate - когда коммитпоследнее изменение (например, rebase).

Вы можете получить их с опциями форматирования --pretty:

       o    %cd: committer date
       o    %cD: committer date, RFC2822 style
       o    %cr: committer date, relative
       o    %ct: committer date, UNIX timestamp
       o    %ci: committer date, ISO 8601 format

Так что, если вы и другие разработчики делаете git rebaseдо git push вы получите дату фиксации , которая позже даты автора .

Эта команда показывает дату фиксации: git log --pretty=fuller

0 голосов
/ 09 октября 2014

Полагаю, вы можете использовать следующую запись для получения даты отправки: git log -g --date = local

...