3.6 标签(Tagging)
与大多数VCS相似,Git具备标识一个特定历史时刻点作为重要标识的能力。通常情况下,人们用这个功能来标识一个release点(v1.0等等)。在本节中,你会学习到怎么列出可用的标签(tags),怎么创建新的标签(tags)以及什么是不同类型的标签。
3.6.1 列出你的标签(Listing Your Tags)
列出Git中可用的标签非常直接,只需要输入git tag:
$ git tag
v0.1
v1.3
这个命令以字母顺序列出标签。它们显示的顺序没有什么实际的重要意义。
你也可以使用特定的格式来查找标签(tags)。例如,Git 源码库包含了超过240个标签。如果你仅仅对1.4.2系列感兴趣,你可以运行:
$ git tag -l 'v1.4.2.*'
v1.4.2.1
v1.4.2.2
v1.4.2.3
v1.4.2.4
3.6.2 创建标签(Creating Tags)
Git使用两类标签(tags):轻型的和标注型的。轻型标签很像一个不能更改的分支――它只是一个指针指向了一个特定的提交。然而,标注型标签在git数据库中是按整个对象存储的。它们是校验的,包含了标签者的名称,e-mail以及日期,一个标签消息,它可以被签名以及使用GNU隐私保护(GPG)来验证。通常建议你创建一个标注型的标签,这样你可以拥有所有这些信息,但如果无论什么原因,你需要一个临时标签而不想保存其它信息,轻型标签也是可用的。
3.6.3 标注标签(Annotated Tags)
在git中创建一个标注标签很简单。最简单的方式是指定一个-a参数当你运行tag命令时:
$ git tag -a v1.4 -m 'my version 1.4'
$ git tag
v0.1
v1.3
v1.4
-m参数用来指定一个标签消息,它与tag一起存储。如果对标注型标签,你不指定消息,则git会调用你的编辑器这样你可以用这个编辑器输入一个消息。
使用git show命令,你会看到标签数据以及被标记的提交:
$ git show v1.4
tag v1.4
Tagger: Scott Chacon <[email protected]>
Date: Mon Feb 9 14:45:11 2009 -0800
my version 1.4
commit 15027957951b64cf874c3557a0f3547bd83b3ff6
Merge: 4a447f7... a6b4c97...
Author: Scott Chacon <[email protected]>
Date: Sun Feb 8 19:02:46 2009 -0800
Merge branch 'experiment'
这显示了标签者的信息,被标记的那个提交的日期,标注的消息;这些会在显示提交信息前被显示。
3.6.4 签署标签(Signed Tags)
如果你有一个私钥的话,你也可以使用GPG对你的标签进行签名。 你要做的是使用-s代替-a:
$ git tag -s v1.5 -m 'my signed 1.5 tag'
You need a passphrase to unlock the secret key for
user: "Scott Chacon <[email protected]>"
1024-bit DSA key, ID F721C45A, created 2009-02-09
如果你在那个标签上运行git show,你会看到你的GPG签名已经附加进去了:
$ git show v1.5
tag v1.5
Tagger: Scott Chacon <[email protected]>
Date: Mon Feb 9 15:22:20 2009 -0800
my signed 1.5 tag
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.8 (Darwin)
iEYEABECAAYFAkmQurIACgkQON3DxfchxFr5cACeIMN+ZxLKggJQf0QYiQBwgySN
Ki0An2JeAVUCAiJ7Ox6ZEtK+NvZAj82/
=WryJ
-----END PGP SIGNATURE-----
commit 15027957951b64cf874c3557a0f3547bd83b3ff6
Merge: 4a447f7... a6b4c97...
Author: Scott Chacon <[email protected]>
Date: Sun Feb 8 19:02:46 2009 -0800
Merge branch 'experiment'
稍后,你会学习怎么校验签名标签。
3.6.5 轻型标签(Lightweight Tags)
另外一种标记提交的方法是使用轻型标签。这是一个基本的存储在文件中提交的校验和――没有保存其它信息。为了创建一个轻型标签,不要应用-a –s或者-m选项:
$ git tag v1.4-lw
$ git tag
v0.1
v1.3
v1.4
v1.4-lw
v1.5
这一次,如果你在标签上运行了git show,你不会看到附加的标签信息。命令仅仅显示了提交:
$ git show v1.4-lw
commit 15027957951b64cf874c3557a0f3547bd83b3ff6
Merge: 4a447f7... a6b4c97...
Author: Scott Chacon <[email protected]>
Date: Sun Feb 8 19:02:46 2009 -0800
Merge branch 'experiment'
3.6.6 校验标签(Verifying Tags)
为了校验一个签名的标签,你可以使用git tag –v [tag-name]。这个命令使用GPG来校验签名。你需要在你的钥匙链中有签名者的公钥才能使本命令正常工作:
$ git tag -v v1.4.2.1
object 883653babd8ee7ea23e6a5c392bb739348b1eb61
type commit
tag v1.4.2.1
tagger Junio C Hamano <[email protected]> 1158138501 -0700
GIT 1.4.2.1
Minor fixes since 1.4.2, including git-mv and git-http with alternates.
gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
gpg: Good signature from "Junio C Hamano <[email protected]>"
gpg: aka "[jpeg image of size 1513]"
Primary key fingerprint: 3565 2A26 2040 E066 C9A7 4A7D C0C6 D9A4 F311 9B9A
如果你没有签名者的公钥,你会得到以下类似的输出:
gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
gpg: Can't check signature: public key not found
error: could not verify the tag 'v1.4.2.1'
3.6.7 延迟标记(Tagging Later)
你也可以在你过去的一个提交上打标签。假设你的提交历史看起来如下:
$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function
4682c3261057305bdd616e23b64b0857d832627b added a todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme
现在,假设你忘了在项目的v1.2即”updated rakefile”提交上做标记。你可以在事后补加这个标记,为了标记这个提交,你需要在命令的最后指定提交的校验和(或者部分校验和):
$ git tag -a v1.2 9fceb02
你可以看到你已经标记了这个提交:
$ git tag
v0.1
v1.2
v1.3
v1.4
v1.4-lw
v1.5
$ git show v1.2
tag v1.2
Tagger: Scott Chacon <[email protected]>
Date: Mon Feb 9 15:32:16 2009 -0800
version 1.2
commit 9fceb02d0ae598e95dc970b74767f19372d61af8
Author: Magnus Chacon <[email protected]>
Date: Sun Apr 27 20:43:35 2008 -0700
updated rakefile
...
3.6.8 共享标签(Sharing Tags)
缺省情况下,git push命令不会传递标签到远端服务器上。在你创建了标签后,你需要显式地把标签上传到共享的服务器上。这个过程就像共享远端分支一样――你可以运行git push origin [tagname].
$ git push origin v1.5
Counting objects: 50, done.
Compressing objects: 100% (38/38), done.
Writing objects: 100% (44/44), 4.56 KiB, done.
Total 44 (delta 18), reused 8 (delta 1)
To [email protected]:schacon/simplegit.git
* [new tag] v1.5 -> v1.5
如果你有很多标签想一次性上传,你可以在git push命令中使用--tags选项。这会把你所有的远端服务器上还没有的标签上传到服务器上。
$ git push origin --tags
Counting objects: 50, done.
Compressing objects: 100% (38/38), done.
Writing objects: 100% (44/44), 4.56 KiB, done.
Total 44 (delta 18), reused 8 (delta 1)
To [email protected]:schacon/simplegit.git
* [new tag] v0.1 -> v0.1
* [new tag] v1.2 -> v1.2
* [new tag] v1.4 -> v1.4
* [new tag] v1.4-lw -> v1.4-lw
* [new tag] v1.5 -> v1.5
现在,当其它人clone或者从你的库下载(pull)时,他们也将会得到你所有的标签(tags)。