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

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

我正在编写一个需要跟踪提交的程序。 由于git日志是按提交datesorting的,而不是推送date,所以我无法看到最近提交的提交。 例如,如果用户在推送到主服务器前2天向其本地存储库提交,则该提交将放置在主存储库日志中的其他提交的两天之后。

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

# 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 

永远不要删除这个永久的克隆,否则你将失去date。

Git是一个分布式的版本控制系统,所以你必须仔细地定义“推送date”的含义。 例如,假设用户A向用户B的存储库推送一些提交。 稍后有一点,用户B将这些提交推送到第三个存储库。 你对哪一天感兴趣?

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

坏消息

不幸的是,没有办法将date追加到提交消息中。 这将改变提交ID(这是内容的SHA1哈希),导致各种问题。

好消息

幸运的是,Git有一个叫做notes的(相对较新的)function。 这个function允许你附加任意的文本提交,哪些git log可以显示。 笔记可以被编辑并与他人共享。

您可以使用便笺function将“此date前收到的提交”消息附加到共享存储库收到的每个提交。

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

如何loggingdate

这是我推荐的方法:

  1. 修改共享存储库上的post-receive钩子以遍历每个更新的引用的每个新近可达的提交。
  2. 对于每个提交,在[commit]的提示上追加一些类似于[repository_url]的[user]在[date]中将[commit]添加到[ref]的东西。

    您可能需要使用专门用于此用途的注释引用(如refs/notes/received-on ),而不是默认的refs/notes/commits 。 这将防止与为其他目的创build的笔记发生冲突。

  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]”笔记来处理这些情况。

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

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

有关检查远程引用日志的答案可能会有所帮助( https://stackoverflow.com/a/8791295/336905 ),通过向您提供有关哪个分支被推送的信息,但不会显示哪些提交被推送,但您可以通过在本地提交date之后查找下一个推送来交叉关联。 如果您还没有实施@RichardHansen先前公布的出色评论build议

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

为什么git AuthorDate与CommitDate不同?

  • AuthorDate是在第一次创build提交时。
  • 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 ,你最终将会得到一个迟于作者date提交date

这个命令显示提交date: git log --pretty=fuller

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