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