过去关于Git中的分支,最近的标签是什么?

过去关于Git中的分支,最近的标签是什么?,git,Git,标记图历史不是线性的。人们不只是标记基线(master) 例如,大多数有价值的JS/CSS库从基线开始对分支执行发布,以保持干净的差异历史记录。它们提交发布工件(编译/缩小的JS/CSS),因此用户无需构建即可轻松获取工件。如果他们标记在master上,那么master历史将具有巨大的构建工件上的所有差异 实例: bash# cd js/jquery /home/user/devel/js/jquery bash# git remote -v origin https://github.co

标记图历史不是线性的。人们不只是标记基线(
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.
来自的技巧在现实世界中是无用的,因为:

git describe --tags
在上面的例子中,我得到了2.1.0-beta1,但最近的成果是3.0.0-alpha1

我目前的最佳方式是从以下位置手动查看:

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

挖掘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 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秒钟,但一些奇怪的填充并没有离开我。有一种线性解决方案吗

更新我在这里写了一个很长的答案,这是关键部分:

因为Git使用DAG而不是线性历史-很难定义距离度量,所以我们可以说-哦,rev最接近我的
头部

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

  • HEAD
    到将base与tag合并的最短路径长度(不知道使用
    git
    命令计算谁)
  • HEAD和tag之间合并基的日期(参见上面的脚本)
  • 可从磁头到达但无法从标签到达的转速数(参见下面的脚本)
根据可从头部到达但无法从标记到达的旋转次数对标记进行排序的脚本:

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

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

from@hydroneaud中有一个按时间顺序打印标记的命令。。。这不正是你想要的吗?我认为时间顺序是理想的度量标准,因为这些标记不一定共享一个共同的历史。@hinerm项目可能支持旧的分支。对于jQuery示例,您可能会看到2.1.4之前的v1.11.3,在不考虑历史数据的情况下,在日期上下单!git for each ref更适合遍历图并选择提交或标记。