Есть ли способ в git получить дату push для данного коммита?

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

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

Ответ 1

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

# 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

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

Ответ 2

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

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

Плохая новость

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

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

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

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

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

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

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

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

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

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

    # 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 также добавлял "удалены в [даты]" для обработки этих случаев.

Ответ 3

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

Другая идея заключается в запуске script внутри пускового крючка.

Ответ 4

Этот ответ, касающийся проверки reflog на удаленном компьютере, может помочь (fooobar.com/questions/4946/...), предоставив вам информацию о том, какая ветка была нажата даже через нее, не показывает которые совершаются, были перенесены, но вы можете перекрестно коррелировать, найдя следующий толчок после локальной даты фиксации. Не безупречный, но удобный, если вы еще не реализовали замечательное предложение от @RichardHansen, опубликованное ранее

Ответ 5

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

Ответ 6

Почему 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

Ответ 7

Я думаю, вы можете использовать следующую нотацию, чтобы получить дату push: git log -g -date = local