标记图表历史记录不是线性的。人们不只是标记基线(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
答案 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访问但无法从标记访问:
$ git tag \
| while read t; do echo `git rev-list --count $t..HEAD` $t; done \
| sort -n
如果您的项目历史记录在提交时有奇怪的日期(因为重写或其他历史记录重写或某些白痴忘记更换BIOS电池或您在历史记录中执行的其他魔法),请使用该脚本。