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"/>
…