获取所有分支的日期,哈希和分支名称

时间:2017-03-07 05:12:38

标签: windows git

以下命令列出了我所有本地分支的最后一个提交哈希和分支名称:

git show-ref --heads

输出:

<hash> <branch-1>
<hash> <branch-2>
...
<hash> <branch-n>

但是,我想查看每个分支的日期。以下命令仅显示当前分支上的日期和哈希值,但不显示最后一次提交的分支名称:

git log -1 --format="%ci %H"

输出:

<date> <hash>

如何获得两者结合的结果?

<date> <hash> <branch-1>
<date> <hash> <branch-2>
...
<date> <hash> <branch-n>

我使用的是Windows 10,没有花哨的命令环境,只是基本的命令提示符。

2 个答案:

答案 0 :(得分:4)

我能够稍微调整this great GitHub post以获得以下内容:

$ for branch in `git branch | grep -v HEAD`;do echo -e
      `git show --format="%ci %cr %H" $branch | head -n 1` \\t$branch; done | sort -r

<强>输出:

2017-03-07 11:38:38 +0800 2 hours ago 87ed1306a1c06576043cd398097a1dc0ec456632 branch1
2017-03-07 02:50:06 +0000 3 hours ago 577fe106a9eb5763cbfd5bce87cfa9448ef52ca8 master
2017-03-07 02:50:06 +0000 3 hours ago 577fe106a9eb5763cbfd5bce87cfa9448ef52ca8 branch2
2017-03-03 17:07:05 +0800 4 days ago 419a23b246ad932c9659b70fded4b1362e92d884  branch3

答案 1 :(得分:0)

没有“分支日期”这样的东西。或者,也许有太多的东西。你需要选择一个。

具体来说,分支名称只是某个特定提交的名称,名称具有一些特殊属性(您可以git checkout在分支上获取该名称,并且一旦在分支上,您就可以git commit进行新的提交并更新名称到哈希ID的条目。

提交自己有日期。更准确地说,它们有两个时间戳,一个用于作者,一个用于提交者。由于分支 name (如masterdevelop命名一个特定提交,因此您可以检索这些提交时间戳中的任何一个并将其用作日期。但是如果我们将分支标签移动到另一个不同的提交,这个日期将会改变,也许会倒退。如果两个不同的分支名称指向相同的提交,则两者都必须具有相同的提交时间戳。

分支 - 实际上,几乎所有 Git引用:分支名称,标记名称,特殊名称(如stash,甚至HEAD本身 - 也有 reflogs ,每个reflog条目记录更改引用的时间和原因:

8dbdf33 HEAD@{11}: reset: moving to HEAD^
70ac787 HEAD@{12}: cherry-pick: change default python path for FreeBSD
8dbdf33 HEAD@{13}: checkout: moving from diff-merge-base to stash-exp

也是:

8dbdf33 HEAD@{6 weeks ago}: reset: moving to HEAD^
70ac787 HEAD@{6 weeks ago}: cherry-pick: change default python path for FreeBSD
8dbdf33 HEAD@{6 weeks ago}: checkout: moving from diff-merge-base to stash-exp

这些reflog条目最终会过期,通常在30到90天之后(取决于reflog条目所指定的提交或其他对象是否可从参考的当前值到达),但直到然后,一些reflog条目或条目可能有资格作为“分支日期”。

Tim Biegeleisen's answer从每个分支名称指向的提交中获取提交者时间戳。 The git log documentation, under the PRETTY FORMATS section,包括,例如:

  

%ci :提交者日期,类似ISO 8601的格式

对于健壮的脚本,我建议替换:

for branch in `git branch | grep -v HEAD`

使用:

for branch in $(git for-each-ref --format='%(refname:short)' refs/heads)

虽然(或类似的东西 - 例如,可以直接在for-each-ref中完成更多工作。)