【问题标题】:Is there a way in git to obtain a push date for a given commit?git 中有没有办法获取给定提交的推送日期?
【发布时间】:2013-09-13 18:57:38
【问题描述】:

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

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

【问题讨论】:

    标签: git github git-push


    【解决方案1】:
    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
    

    【讨论】:

    • 嗨 VC 这是否意味着如果命令“reflog show origin/master --pretty='%Cred%h%Creset -%C(yellow)%gd%Creset %Cblue(% gs)%Creset %s' --date=iso" 是 "da4c192cd -origin/master@{2019-02-07 08:13:40 +0100} (pull: fast-forward) JIRA-2542 增强测试报告",这意味着然后我的分支 JIRA-2542 的内容在 2019-02-07 08:13:40 通过快进合并到 origin/master 上?
    • 嗨,西蒙,是的。你在你的分支上做了一个 git pull 并且它当时通过快进合并到 origin/master 上。
    • 它仅适用于作者的存储库。如果我克隆存储库,则该值为空。你看不到其他人的推送时间。
    【解决方案2】:

    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 push 之前做git rebase, 你最终会得到一个晚于作者日期提交日期

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

    【讨论】:

      【解决方案3】:

      你也可以在服务器本身的git仓库的“objects”目录下查看commit object文件的文件修改时间。

      【讨论】:

        【解决方案4】:

        我猜你可以使用下一个符号来获取推送日期: git log -g --date=local

        【讨论】:

          【解决方案5】:

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

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

          坏消息

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

          好消息

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

          您可以使用注释功能将“此提交已在 [日期] 收到”消息附加到共享存储库收到的每个提交。

          详情请见git help notes

          如何记录日期

          这是我推荐的方法:

          1. 修改共享存储库上的 post-receive 挂钩,以遍历每个更新的引用的每个新可达的提交。
          2. 对于每个提交,在提交的注释中附加类似“[repository_url] 的[user] 将此提交添加到 [ref] on [date]”之类的内容。

            您可能希望使用专门用于此目的的注释引用(如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】:

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

          # 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
          

          切勿删除此永久克隆,否则您将丢失日期。

          【讨论】:

          • 我想补充一点,就我而言,我必须执行git reflog --date=local origin/master(注意origin/)才能查看推送列表。否则,列表中只有提交、签出和拉取(这也很有用)。其实我是被@JonathanDay's answer指出来的。
          • @NIA: origin/master 只会给你一个近似值。我已经根据您的评论更新了我的答案,这是否澄清?
          【解决方案7】:

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

          【讨论】:

          • 请注意 origin/branch 的 reflog 只会显示在 当前 机器上所做的更改,这非常有用!对于日常使用,我不想实现任何钩子,所以对于一个简单的问题“嗯,我上周推送那个提交是什么时候?” - 效果很好。
          【解决方案8】:

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

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

          【讨论】:

          • 我想过运行 push hook,但似乎这应该是最后的努力。有了一个钩子,似乎每个用户都必须在他们的每个存储库中都有这个钩子。您能否更具体地了解git reflog show master?我希望能够查看每个用户的个人提交的推送日期。
          • git reflog 显示您在其中运行它的任何 repo 中更改的 order。我不确定是否有直接获取日期的方法,但在 .git/logs/refs/heads/master它显示一个时间戳。
          • 至于钩子,有接收钩子在你推送的机器上运行。由于推送仅与特定回购相关,我假设您有某个“有福”的回购,您想在其上运行它。就此而言,git reflog 也是如此。
          猜你喜欢
          • 1970-01-01
          • 2012-06-01
          • 1970-01-01
          • 2011-07-17
          • 1970-01-01
          • 2018-03-24
          相关资源
          最近更新 更多