我有许多包含不同版本标签的Git分支。我正在寻找一种解决方案,其中逐行列出了所有分支机构及其最新编号的标签。(版本始终具有相同的格式:XYZ)
例子:
硕士:2.2.2
分支B:2.2.1
分支C:2.0.0
如果您没有任何多余的标签,乱扔垃圾的地方@sajibkhan的主意是正确的,
git for-each-ref refs/heads refs/remotes --format='
printf '%s: ' %(refname:short); git describe --tags --abbrev=0 %(refname:short)
' |sh
或更熟悉的是while read
,
git branch -a|sed s/.//|while read branch; do
printf '%s: ' "$branch"; git describe --tags --abbrev=0 $branch
done
但是你的
他们最新的编号标签
让我觉得您有一些未编号的标签,这些标签git describe
有时会产生错误的结果。
git describe
有一个--match
选项,因此,如果您可以为要考虑的标签准备一个正匹配的标记,例如,如果--match=[0-9]*
愿意的话,只需添加它即可。但是,例如linux具有诸如v4.8.1
和的标记v2.6.3-rc7
,并且仅将第一个标记与glob模式匹配并不容易。
对于这样的情况,有一个非常好的ref手术技术:
scratch=`mktemp -d`
git clone -s --mirror . "$scratch"
cd !$
制作了一个非常快速的从头开始克隆,带有重复的引用,但没有实际的内容。的-s
缩写--shared
,仓库使用主对象db,镜像克隆始终是裸露的,因此没有签出。将共享库克隆用于您不确定要获得结果还是需要前后的任何临时工作。
因此,既然您在沙盒镜中,就可以删除不想在此处看到的引用:
git for-each-ref refs/tags/*[^0-9.]* --format='
delete %(refname)
' | git update-ref --stdin
删除任何名称中任何具有非数字或点的标记。
清理后的便笺本refname空间已准备好用于git describe
上面的简单s。
这是一种通用技术:您可以在任何具有url或路径名的位置,通过任何所需的重写来推送和获取所需的任何引用。这包括您的本地存储库。例如,这是为每个远程跟踪分支建立或快速转发本地分支的一种残酷方法:
git fetch . refs/remotes/origin/*:refs/heads/*
(首先在临时克隆中执行此操作...)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句