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.reflogExpire
和gc.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
这是我推荐的方法:
- 修改共享存储库上的
post-receive
钩子以遍历每个更新的引用的每个新近可达的提交。 -
对于每个提交,在[commit]的提示上追加一些类似于[repository_url]的[user]在[date]中将[commit]添加到[ref]的东西。
您可能需要使用专门用于此用途的注释引用(如
refs/notes/received-on
),而不是默认的refs/notes/commits
。 这将防止与为其他目的创build的笔记发生冲突。 - 修改您的
receive
挂钩拒绝更新您的笔记引用(以防止用户意外或故意搞乱笔记)。 -
告诉所有用户从他们的工作树中运行以下命令:
# 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