git中是否有办法获取给定提交的推送日期?


91

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

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

Answers:


77

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

# 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

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


2
我想补充一点,在我的情况下,我必须做git reflog --date=local origin/master(注意origin/)才能看到推送列表。否则,列表中仅包含提交,签出和提取(这也很有用)。实际上,@ JonathanDay的答案已指出了这一点。
NIA

@NIA:起源/母带只会给您一个近似值。在您发表评论后,我已经更新了答案,是否可以澄清?
MarcH 2013年

37

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

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

坏消息

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

好消息

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

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

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

如何记录日期

这是我推荐的方法:

  1. 修改post-receive共享存储库上的钩子,以遍历每个更新的引用的每个新到达的提交。
  2. 对于每个提交,在提交的注释后附加“在[date]的[user] of [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钩子还附加“在[date]删除”注释以处理这些情况。



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

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

请注意,如果您是从原始/母版中获取的,它将打印您获取的日期。不是其他人推送提交的日期。

 - %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}(拉:快进)JIRA-2542增强测试报告”,则意味着我的分支JIRA的内容-2542在2019-02-07 08:13:40通过快速转发合并到了原点/主节点上?
西蒙

嗨,西蒙,是的。您在分支上进行了git pull,当时它通过快速转发合并到了origin / master上。
VC

它仅适用于作者的存储库。如果克隆存储库,则该值为空。您看不到其他人的推送时间。
拉姆温

6

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

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


我考虑过要运行推钩,但这似乎是最后的努力。有了钩子,似乎每个用户都必须在每个存储库中都具有该钩子。您能否更具体地说明git reflog show master?我希望能够查看每个用户的单个提交的推送日期。
justkikuchi 2011年

git reflog显示您在其中运行的任何回购中的更改顺序。我不确定是否有直接的方法来获取日期,但.git/logs/refs/heads/master其中显示了时间戳。
Karl Bielefeldt

3
至于挂钩,有收到你推机器上运行钩。由于推送仅与特定回购相关,因此我假设您要运行某个“祝福”回购。同样的git reflog事情。
Karl Bielefeldt

5

这个有关检查远程reflog的答案可能会有所帮助(https://stackoverflow.com/a/8791295/336905),方法是向您提供有关哪一个分支已被推送的信息,即使该分支通过它也不会显示已推送了哪些提交,但是您可以通过找到本地提交日期之后的下一个推送来进行互相关。不是很简单,但是如果您还没有实现@RichardHansen的出色笔记建议,那么它会派上用场


1
注意reflog origin/branch只会显示当前机器上所做的更改,这非常有用!对于日常使用,我不想实现任何挂钩,因此对于一个简单的问题“嗯,我上周何时提交该提交?” —效果很好。
NIA

4

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


2

为什么git AuthorDate与CommitDate不同?

  • 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 rebase之前已经做过git push,那么最终提交日期将晚于author date

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


1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.