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

git中有没有一种方法可以获得给定提交的推送日期?,git,github,git-push,Git,Github,Git Push,我想知道是否有办法在git日志中查看与每次提交相关联的推送日期。如果这是不可能的,是否有一种方法可以查看特定推送下的所有提交 我正在编写一个程序,需要在推送提交时跟踪提交。因为git日志是按提交日期排序的,而不是按推送日期排序的,所以我无法看到最近推送的提交。例如,如果用户在推送到主存储库之前2天提交到其本地存储库,则该提交将放在主存储库日志中其他提交的2天之后。请查看git reflog show master。可能不是您想要的确切格式,但应该为您指明正确的方向 另一个想法是在推送钩子中运行脚

我想知道是否有办法在git日志中查看与每次提交相关联的推送日期。如果这是不可能的,是否有一种方法可以查看特定推送下的所有提交


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

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


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

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

我推测您有一个共享存储库,并且希望该共享存储库的用户能够确定何时将某些内容发布到存储库。如果这是真的,那么您必须在共享存储库中收集这些信息

坏消息 不幸的是,无法将日期附加到提交消息中。这将改变提交ID(内容的SHA1散列),导致各种问题

好消息 幸运的是,Git有一个(相对较新的)特性,叫做notes。此功能允许您将任意文本附加到提交中,
git log
可以显示这些文本。注释可以编辑并与其他人共享

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

有关详细信息,请参见git帮助说明

如何记录日期 以下是我推荐的方法:

  • 修改共享存储库上的
    post receive
    钩子,以便为每个更新的引用遍历每个新可到达的提交
  • 对于每次提交,在提交的备注中添加类似“[repository\u url]的[user]在[date]将此提交添加到[ref]”的内容

    您可能希望使用专用于此目的的notes参考(如
    refs/notes/received on
    ),而不是默认的
    refs/notes/committes
    。这将防止与为其他目的创建的注释发生冲突

  • 修改
    receive
    hook以拒绝对notes引用的更新(防止用户意外或故意弄乱notes)
  • 告诉所有用户从其工作树中运行以下命令:

    # 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
    hook也附加“在[日期]删除”的注释来处理这些情况。

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

    # 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
    

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

    此关于在远程设备上检查reflog的回答可能会有帮助(),因为它会提供有关推送分支的信息,即使通过该分支也不会显示推送了哪些提交,但您可以通过在本地提交日期之后查找下一个推送来进行交叉关联。不是傻瓜式的,但是如果您还没有实施之前发布的@RichardHansen的优秀notes建议,那么您可以使用下一个符号来获取推送日期:
    git log-g--date=local

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

    • AuthorDate
      是首次创建提交的时间
    • CommitDate
      是上次修改提交的时间(例如,重新设置基础)
    您可以使用
    --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-push
    之前执行
    git-rebase
    , 您将得到一个提交日期,该日期晚于作者日期

    此命令显示提交日期:
    git log--pretty=fuller

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

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

    奖励:当然,你可以做更多漂亮的格式化。到目前为止,我喜欢这种颜色编码。不过打字有点难。这会将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
    

    我曾考虑过运行推钩,但似乎这应该是最后的努力。有了一个钩子,似乎每个用户都必须在他们的每个存储库中都有这个钩子。您能否更具体地介绍一下git reflog show master?我希望能够查看每个用户个人提交的推送日期
    git reflog show origin/master --pretty='format:%C(red)%h%Creset %C(cyan)%gd%Creset %C(green)%gs%Creset: %s' --date=iso