过去最接近Git分支的标签是什么?

时间:2015-11-04 19:41:32

标签: git

标记图表历史记录不是线性的。人们不只是标记基线(master)。

例如大多数有价值的JS / CSS库从基线执行分支上的发布以保持干净的差异历史记录。它们提交了发布工件(编译/缩小的JS / CSS),因此用户可以轻松地获取工件而无需构建。如果他们在master上标记,则master历史记录将在构建工件上具有巨大的全部差异。

真实的例子:

bash# cd js/jquery
/home/user/devel/js/jquery

bash# git remote -v
origin  https://github.com/jquery/jquery.git (fetch)

bash# git co master
Already on 'master'

bash# git describe --tags
2.1.0-beta1-590-g47ccf3d

bash# git log --graph  --decorate --simplify-by-decoration --oneline --all
* 70605c8 (origin/master, origin/HEAD) Ajax: Only form-encode requests with a body
* 47ccf3d (HEAD -> master) Attributes: do not set properties to false when removing booleans
| * 8339185 (origin/compat) Tests: Make regexes for iOS devices more rigid
| | * f9846ae (tag: 3.0.0-alpha1) 3.0.0-alpha1
| |/  
|/|   
...
* | 1185427 (tag: 2.1.0-beta1) Tagging the 2.1.0-beta1 release.

来自How to get the latest tag name in current branch in Git?的技巧在现实世界中毫无用处,因为:

git describe --tags

我在上面的示例中获得了 2.1.0-beta1 ,但最近的努力是 3.0.0-alpha1

我目前最好的方法是手动审核collapsed commit history

git log --graph --decorate --simplify-by-decoration --oneline --all

1 个答案:

答案 0 :(得分:1)

在深入研究Git文档后,我设法写道:

$ git tag \
     | while read t; do \
         b=`git merge-base HEAD $t`; \
         echo `git log -n 1 $b --format=%ai` $t; \
       done | sort
...
2014-04-18 17:17:51 -0400 2.1.1-rc2
2014-04-30 10:43:39 -0400 2.1.1
2014-05-18 20:47:37 +0400 2.1.2
2014-05-18 20:47:37 +0400 2.1.3
2014-05-18 20:47:37 +0400 2.1.4
2015-07-13 15:01:33 -0400 3.0.0-alpha1

当我对Hg充满信心时,我做出了相应的解决方案:

$ hg convert \
    $(git -C jquery/ rev-parse --branches --remotes --tags \
      | sed 's=.*=--rev &=') \
  jquery/ jquery-hg/

$ cd jquery-hg
$ hg up -r master

$ hg log -r 'tag()' --template '{node} {tags}\n' \
    | while read r t; do \
        hg log -r "ancestor($r,.)" --template "{date|isodate} {node} $t \n"; \
      done | sort

2014-06-16 03:08 +0400 f6f4d6eb708a33f714a2e0003cb7087762407348 2.1.2 
2014-06-16 03:08 +0400 f6f4d6eb708a33f714a2e0003cb7087762407348 2.1.3 
2014-06-16 03:08 +0400 f6f4d6eb708a33f714a2e0003cb7087762407348 2.1.4 
2015-07-13 15:01 -0400 4abe7e961f0e5eb0e75f03030a80a128553f34c1 3.0.0-alpha1 

我可以为~/.bashrc添加别名,这段代码在jQuery / Hibernate / Lunix / Spring源代码上花了将近4秒但是有些奇怪的填充不会让我失望。有单线解决方案吗?

更新我在https://stackoverflow.com/a/34239190/173149写了一个很长的答案。这是必不可少的部分:

因为Git使用DAG而非线性历史记录 - 很难定义距离指标所以我们可以说 - 哦,转速最接近我的HEAD

标签和修订之间距离的一些合理定义:

  • 最短路径的长度HEAD合并基地与标记(不知道用git命令计算的人)
  • 日期 合并基础HEAD和标记之间(参见上面的脚本)
  • 转发次数可从HEAD访问但无法从标记访问(参见下面的脚本)

根据转数对标记进行排序的脚本,该标记可从HEAD访问但无法从标记访问:

$ git tag \
    | while read t; do echo `git rev-list --count $t..HEAD` $t; done \
    | sort -n

如果您的项目历史记录在提交时有奇怪的日期(因为重写或其他历史记录重写或某些白痴忘记更换BIOS电池或您在历史记录中执行的其他魔法),请使用该脚本。