17.7 里程碑命名规范
在正式项目的版本库管理中,要为里程碑创建订立一些规则,诸如:
对创建里程碑进行权限控制,参考后面Git服务器架设的相关章节。
不要使用轻量级里程碑(只用于本地临时性里程碑),而是要使用带说明的里程碑,甚至要求必须使用带签名的里程碑。
如果使用带签名的里程碑,可以考虑设置专用账户,使用专用的私钥创建签名。
里程碑的命名要使用统一的风格,并很容易和最终产品显示的版本号相对应。
Git的里程碑命名还有一些特殊的约定需要遵守。实际上,下面的这些约定对于下一章要介绍的分支及任何其他引用均适用:
不要以符号“-”开头。以免在命令行中被当成命令的选项。
可以包含路径分隔符“/”,但是路径分隔符不能位于最后。
使用路径分隔符创建tag实际上会在引用目录下创建子目录。例如名为demo/v1.2.1的里程碑,就会创建目录.git/refs/tags/demo并在该目录下创建引用文件v1.2.1。
不能出现两个连续的点“..”。因为两个连续的点被用于表示版本范围,当然更不能使用三个连续的点。
如果在里程碑命名中使用了路径分隔符“/”,就不能在任何一个分隔路径中以点“.”开头。这是因为里程碑在用简写格式表达时,可能造成以一个点“.”开头。这样的引用名称在用作版本范围的最后一个版本时,本来两点操作符变成了三点操作符,从而造成歧义。
不能在里程碑名称的最后出现点“.”。否则作为第一个参数出现在表示版本范围的表达式中时,本来版本范围表达式可能用的是两点操作符,结果被误作三点操作符。
不能使用特殊字符,如:空格、波浪线“~”、脱字符“^”、冒号“:”、问号“?”、星号“*”、方括号“[”,以及字符\177(删除字符)或小于\040(32)的Ascii码都不能使用。
这是因为波浪线“~”和脱字符“^”都用于表示一个提交的祖先提交。冒号被用作引用表达式来分隔两个不同的引用,或者用于分隔引用代表的树对象和该目录树中的文件。问号、星号和方括号在引用表达式中都被用作通配符。
不能以".lock"为结尾。因为以".lock"结尾的文件是里程碑操作过程中的临时文件。
不能包含“@{”字串。否则易和reflog的"@{<num>}"语法相混淆。
不能包含反斜线“\”。因为反斜线用于命令行或shell脚本会造成意外。
Git还专门为检查引用名称是否符合规范提供了一个命令:git check-ref-format。若该命令返回值为0,则引用名称符合规范,若返回值为1,则不符合规范。
$git check-ref-format refs/tags/.name||echo "返回$?,不合法的引用" 返回1,不合法的引用
1.Linux中的里程碑
Linux内核项目无疑是使用Git版本库时间最久远,也是最重量级的项目。研究Linux内核项目本身的里程碑命名和管理,无疑会为自己的项目提供借鉴。
(1)首先看看Linux中的里程碑命名。可以看到里程碑都是以字母v开头。
$git ls-remote—tags\ git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-2.6-stable.git\ v2.6.36* 25427f38d3b791d986812cb81c68df38e8249ef8 refs/tags/v2.6.36 f6f94e2ab1b33f0082ac22d71f66385a60d8157f refs/tags/v2.6.36^{} 8ed88d401f908a594cd74a4f2513b0fabd32b699 refs/tags/v2.6.36-rc1 da5cabf80e2433131bf0ed8993abc0f7ea618c73 refs/tags/v2.6.36-rc1^{} … 7619e63f48822b2c68d0e108677340573873fb93 refs/tags/v2.6.36-rc8 cd07202cc8262e1669edff0d97715f3dd9260917 refs/tags/v2.6.36-rc8^{} 9d389cb6dcae347cfcdadf2a1ec5e66fc7a667ea refs/tags/v2.6.36.1 bf6ef02e53e18dd14798537e530e00b80435ee86 refs/tags/v2.6.36.1^{} ee7b38c91f3d718ea4035a331c24a56553e90960 refs/tags/v2.6.36.2 a1346c99fc89f2b3d35c7d7e2e4aef8ea4124342 refs/tags/v2.6.36.2^{}
(2)以-rc<num>为后缀的是先于正式版发布的预发布版本。
可以看出这个里程碑是一个带签名的里程碑。关于此里程碑的说明也是再简练不过了。
$git show v2.6.36-rc1 tag v2.6.36-rc1 Tagger:Linus Torvalds<torvalds@linux-foundation.org> Date:Sun Aug 15 17:42:10 2010-0700 Linux 2.6.36-rc1 ——-BEGIN PGP SIGNATURE——- Version:GnuPG v1.4.10(GNU/Linux) iEYEABECAAYFAkxoiWgACgkQF3YsRnbiHLtYKQCfQSIVcj2hvLj6IWgP9xK2FE7T bPoAniJ1CjbwLxQBudRi71FvubqPLuVC =iuls ——-END PGP SIGNATURE——- commit da5cabf80e2433131bf0ed8993abc0f7ea618c73 Author:Linus Torvalds<torvalds@linux-foundation.org> Date:Sun Aug 15 17:41:37 2010-0700 Linux 2.6.36-rc1 diff—git a/Makefile b/Makefile index 788111d..f3bdff8 100644 —-a/Makefile +++b/Makefile @@-1,7+1,7@@ VERSION=2 PATCHLEVEL=6 -SUBLEVEL=35 -EXTRAVERSION= +SUBLEVEL=36 +EXTRAVERSION=-rc1 NAME=Sheep on Meth #DOCUMENTATION
(3)正式发布版去掉了预发布版的后缀。
$git show v2.6.36 tag v2.6.36 Tagger:Linus Torvalds<torvalds@linux-foundation.org> Date:Wed Oct 20 13:31:18 2010-0700 Linux 2.6.36 The latest and greatest,and totally bug-free.At least until 2.6.37 comes along and shoves it under a speeding train like some kind of a bully. ——-BEGIN PGP SIGNATURE——- Version:GnuPG v1.4.10(GNU/Linux) iEYEABECAAYFAky/UcwACgkQF3YsRnbiHLvg/ACffKjAb1fD6fpqcHbSijHHpbP3 4SkAnR4xOy7iKhmfS50ZrVsOkFFTuBHG =JD3z ——-END PGP SIGNATURE——- commit f6f94e2ab1b33f0082ac22d71f66385a60d8157f Author:Linus Torvalds<torvalds@linux-foundation.org> Date:Wed Oct 20 13:30:22 2010-0700 Linux 2.6.36 diff—git a/Makefile b/Makefile index 7583116..860c26a 100644 —-a/Makefile +++b/Makefile @@-1,7+1,7@@ VERSION=2 PATCHLEVEL=6 SUBLEVEL=36 -EXTRAVERSION=-rc8 +EXTRAVERSION= NAME=Flesh-Eating Bats with Fangs #DOCUMENTATION
(4)正式发布后的升级/修正版本是通过最后一位数字的变动来体现的。
$git show v2.6.36.1 tag v2.6.36.1 Tagger:Greg Kroah-Hartman<gregkh@suse.de> Date:Mon Nov 22 11:04:17 2010-0800 This is the 2.6.36.1 stable release ——-BEGIN PGP SIGNATURE——- Version:GnuPG v2.0.15(GNU/Linux) iEYEABECAAYFAkzqvrIACgkQMUfUDdst+ym9VQCgmE1LK2eC/LE9HkscsxL1X62P 8F0AnRI28EHENLXC+FBPt+AFWoT9f1N8 =BX5O ——-END PGP SIGNATURE——- commit bf6ef02e53e18dd14798537e530e00b80435ee86 Author:Greg Kroah-Hartman<gregkh@suse.de> Date:Mon Nov 22 11:03:49 2010-0800 Linux 2.6.36.1 diff—git a/Makefile b/Makefile index 860c26a..dafd22a 100644 —-a/Makefile +++b/Makefile @@-1,7+1,7@@ VERSION=2 PATCHLEVEL=6 SUBLEVEL=36 -EXTRAVERSION= +EXTRAVERSION=.1 NAME=Flesh-Eating Bats with Fangs #DOCUMENTATION
2.Android项目
看看其他项目的里程碑命名,会发现不同项目关于里程碑的命名各不相同。但是对于同一个项目要在里程碑命名上遵照同一标准,并能够和软件版本号正确地对应。
Android项目是一个非常有特色的使用Git版本库的项目,在后面会用两章介绍Android项目为Git带来的两个新工具。看看Android项目的里程碑编号对自己版本库的管理有无启发。
(1)看看Android项目中的里程碑命名,会发现其里程碑的命名格式为android-<大版本号>_r<小版本号>。
$git ls-remote—tags\ git://android.git.kernel.org/platform/manifest.git\ android-2.2* 6a03ae8f564130cbb4a11acfc49bd705df7c8df6 refs/tags/android-2.2.1_r1 599e242dea48f84e2f26054b0d1721e489043440 refs/tags/android-2.2.1_r1^{} 656ba6fdbd243153af6ec31017de38641060bf1e refs/tags/android-2.2_r1 27cd0e346d1f3420c5747e01d2cb35e9ffd025ea refs/tags/android-2.2_r1^{} f6b7c499be268f1613d8cd70f2a05c12e01bcb93 refs/tags/android-2.2_r1.1 bd3e9923773006a0a5f782e1f21413034096c4b1 refs/tags/android-2.2_r1.1^{} 03618e01ec9bdd06fd8fe9afdbdcbaf4b84092c5 refs/tags/android-2.2_r1.2 ba7111e1d6fd26ab150bafa029fd5eab8196dad1 refs/tags/android-2.2_r1.2^{} e03485e978ce1662a1285837f37ed39eadaedb1d refs/tags/android-2.2_r1.3 7386d2d07956be6e4f49a7e83eafb12215e835d7 refs/tags/android-2.2_r1.3^{}
(2)里程碑的创建过程中使用了专用账号和GnuPG签名。
$git show android-2.2_r1 tag android-2.2_r1 Tagger:The Android Open Source Project<initial-contribution@android.com> Date:Tue Jun 29 11:28:52 2010-0700 Android 2.2 release 1 ——-BEGIN PGP SIGNATURE——- Version:GnuPG v1.4.6(GNU/Linux) iD8DBQBMKjtm6K0/gZqxDngRAlBUAJ9QwgFbUL592FgRZLTLLbzhKsSQ8ACffQu5 Mjxg5X9oc+7N1DfdU+pmOcI= =0NG0 ——-END PGP SIGNATURE——- commit 27cd0e346d1f3420c5747e01d2cb35e9ffd025ea Author:The Android Open Source Project<initial-contribution@android.com> Date:Tue Jun 29 11:27:23 2010-0700 Manifest for android-2.2_r1 diff—git a/default.xml b/default.xml index 4f21453..aaa26e3 100644 —-a/default.xml +++b/default.xml @@-3,7+3,7@@ <remote name= "korg" fetch="git://android.git.kernel.org/" review="review.source.android.com"/> -<default revision="froyo" +<default revision="refs/tags/android-2.2_r1" remote="korg"/> …
