在git中有一种方法可以获得给定提交的推送日期吗?

时间:2011-07-22 19:29:05

标签: git github git-push

我想知道是否有办法查看与git日志中每个提交相关的推送日期。如果那是不可能的,有没有办法在一定推动下看到所有提交。

我编写的程序需要在推送时跟踪提交。因为git日志是按提交日期而不是推送日期排序的,所以我无法看到推送的最新提交。例如,如果用户在推送到主服务器的2天前提交到他的本地存储库,则该提交将被放置在主存储库日志中的其他提交的2天后。

8 个答案:

答案 0 :(得分:68)

我花了很长时间收集零散的信息,最后找到了这个问题的最佳答案,但现在我知道我有了。只有两行,没有代码也没有钩子:

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

git reflog --date=local master

最后很简单。

警告:您可能希望覆盖gc.reflogExpiregc.reflogExpireUnreachable的默认值。查看git help reflog了解详情,了解其工作原理和原因。

上面的两个命令必须在您推送到的克隆中运行。如果不可能,则近似将在另一个永久克隆中运行:

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

永远不要删除此永久克隆,否则您将丢失日期。

答案 1 :(得分:34)

Git是一个分布式版本控制系统,因此您必须仔细定义“推送日期”的含义。例如,假设用户A将一些提交推送到用户B的存储库。稍后,用户B将这些相同的提交推送到第三个存储库。你对哪个日期感兴趣?

我猜测你有一个共享存储库,并希望该共享存储库的用户能够确定什么时候发布到存储库。如果这是真的,那么您必须在共享存储库中收集该信息。

坏消息

不幸的是,没有办法将日期附加到提交消息中。这会改变提交ID(内容的SHA1哈希值),从而导致各种问题。

好消息

幸运的是,Git有一个名为 notes 的(相对较新的)功能。此功能允许您将任意文本附加到git log可以显示的提交。可以编辑备注并与他人共享。

您可以使用notes功能将“在[date]上收到此提交”消息附加到共享存储库接收到的每个提交。

有关详细信息,请参阅git help notes

如何记录日期

以下是我推荐的方法:

  1. 修改共享存储库中的post-receive挂钩,以便为每个更新的引用遍历每个新可访问的提交。
  2. 对于每次提交,添加类似“[user_url]的[user]将此提交添加到[date]的[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默认忽略上游存储库中的非分支,非标记引用。

  5. 以上假设引用只是高级,永不删除或强制更新。您可能希望post-receive挂钩也附加“删除[日期]”注释来处理这些情况。

答案 2 :(得分:6)

看看git reflog show master。可能不是您想要的确切格式,但应该指向正确的方向。

另一个想法是在推送钩内运行脚本。

答案 3 :(得分:5)

关于检查遥控器上的reflog的这个答案可能有助于(https://stackoverflow.com/a/8791295/336905)通过向您提供有关哪个分支被推送的信息,即使它没有显示哪些提交被推送,但您可以通过交叉关联在本地提交日期之后找到下一个推送。不是万无一失,但如果你还没有实现之前发布的@RichardHansen的优秀笔记建议,那就不方便了

答案 4 :(得分:4)

您还可以在"对象"中查看提交对象文件的文件修改时间。服务器本身的git存储库中的目录。

答案 5 :(得分:3)

Why git AuthorDate is different from 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

答案 6 :(得分:3)

git reflog show origin/master --pretty='%h %gd %gs %s' --date=iso

这对我来说似乎很有效。提交者日期(%cd)具有误导性,因为它不一定与推送日期相同。 --date = iso选项,但将输出推送/获取日期

注意,如果您从origin / master获取,它将打印您获取它的日期;不是其他人推送提交的日期。

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

奖励:你当然可以做更漂亮的格式化。到目前为止,我喜欢这种颜色编码。虽然打字有点多。这会将SHA输出为红色,将reflog选择器输出为青色,并将reflog输出为绿色。

git reflog show origin/master --pretty='format:%C(red)%h%Creset %C(cyan)%gd%Creset %C(green)%gs%Creset: %s' --date=iso

答案 7 :(得分:0)

我猜您可以使用下一个表示法来获取推送日期: git log -g --date = local