Documentation / git-tag.txton commit Merge the attributes fix in from maint-1.6.6 branch (6c65b5e)
   1git-tag(1)
   2==========
   3
   4NAME
   5----
   6git-tag - Create, list, delete or verify a tag object signed with GPG
   7
   8
   9SYNOPSIS
  10--------
  11[verse]
  12'git tag' [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>]
  13        <tagname> [<commit> | <object>]
  14'git tag' -d <tagname>...
  15'git tag' [-n[<num>]] -l [--contains <commit>] [<pattern>...]
  16'git tag' -v <tagname>...
  17
  18DESCRIPTION
  19-----------
  20
  21Add a tag reference in `.git/refs/tags/`, unless `-d/-l/-v` is given
  22to delete, list or verify tags.
  23
  24Unless `-f` is given, the tag to be created must not yet exist in the
  25`.git/refs/tags/` directory.
  26
  27If one of `-a`, `-s`, or `-u <key-id>` is passed, the command
  28creates a 'tag' object, and requires a tag message.  Unless
  29`-m <msg>` or `-F <file>` is given, an editor is started for the user to type
  30in the tag message.
  31
  32If `-m <msg>` or `-F <file>` is given and `-a`, `-s`, and `-u <key-id>`
  33are absent, `-a` is implied.
  34
  35Otherwise just a tag reference for the SHA1 object name of the commit object is
  36created (i.e. a lightweight tag).
  37
  38A GnuPG signed tag object will be created when `-s` or `-u
  39<key-id>` is used.  When `-u <key-id>` is not used, the
  40committer identity for the current user is used to find the
  41GnuPG key for signing.
  42
  43OPTIONS
  44-------
  45-a::
  46        Make an unsigned, annotated tag object
  47
  48-s::
  49        Make a GPG-signed tag, using the default e-mail address's key
  50
  51-u <key-id>::
  52        Make a GPG-signed tag, using the given key
  53
  54-f::
  55--force::
  56        Replace an existing tag with the given name (instead of failing)
  57
  58-d::
  59        Delete existing tags with the given names.
  60
  61-v::
  62        Verify the gpg signature of the given tag names.
  63
  64-n<num>::
  65        <num> specifies how many lines from the annotation, if any,
  66        are printed when using -l.
  67        The default is not to print any annotation lines.
  68        If no number is given to `-n`, only the first line is printed.
  69        If the tag is not annotated, the commit message is displayed instead.
  70
  71-l <pattern>::
  72        List tags with names that match the given pattern (or all if no
  73        pattern is given).  Running "git tag" without arguments also
  74        lists all tags. The pattern is a shell wildcard (i.e., matched
  75        using fnmatch(3)).  Multiple patterns may be given; if any of
  76        them matches, the tag is shown.
  77
  78--contains <commit>::
  79        Only list tags which contain the specified commit.
  80
  81-m <msg>::
  82        Use the given tag message (instead of prompting).
  83        If multiple `-m` options are given, their values are
  84        concatenated as separate paragraphs.
  85        Implies `-a` if none of `-a`, `-s`, or `-u <key-id>`
  86        is given.
  87
  88-F <file>::
  89        Take the tag message from the given file.  Use '-' to
  90        read the message from the standard input.
  91        Implies `-a` if none of `-a`, `-s`, or `-u <key-id>`
  92        is given.
  93
  94<tagname>::
  95        The name of the tag to create, delete, or describe.
  96        The new tag name must pass all checks defined by
  97        linkgit:git-check-ref-format[1].  Some of these checks
  98        may restrict the characters allowed in a tag name.
  99
 100CONFIGURATION
 101-------------
 102By default, 'git tag' in sign-with-default mode (-s) will use your
 103committer identity (of the form "Your Name <your@email.address>") to
 104find a key.  If you want to use a different default key, you can specify
 105it in the repository configuration as follows:
 106
 107-------------------------------------
 108[user]
 109    signingkey = <gpg-key-id>
 110-------------------------------------
 111
 112
 113DISCUSSION
 114----------
 115
 116On Re-tagging
 117~~~~~~~~~~~~~
 118
 119What should you do when you tag a wrong commit and you would
 120want to re-tag?
 121
 122If you never pushed anything out, just re-tag it. Use "-f" to
 123replace the old one. And you're done.
 124
 125But if you have pushed things out (or others could just read
 126your repository directly), then others will have already seen
 127the old tag. In that case you can do one of two things:
 128
 129. The sane thing.
 130Just admit you screwed up, and use a different name. Others have
 131already seen one tag-name, and if you keep the same name, you
 132may be in the situation that two people both have "version X",
 133but they actually have 'different' "X"'s.  So just call it "X.1"
 134and be done with it.
 135
 136. The insane thing.
 137You really want to call the new version "X" too, 'even though'
 138others have already seen the old one. So just use 'git tag -f'
 139again, as if you hadn't already published the old one.
 140
 141However, Git does *not* (and it should not) change tags behind
 142users back. So if somebody already got the old tag, doing a
 143'git pull' on your tree shouldn't just make them overwrite the old
 144one.
 145
 146If somebody got a release tag from you, you cannot just change
 147the tag for them by updating your own one. This is a big
 148security issue, in that people MUST be able to trust their
 149tag-names.  If you really want to do the insane thing, you need
 150to just fess up to it, and tell people that you messed up. You
 151can do that by making a very public announcement saying:
 152
 153------------
 154Ok, I messed up, and I pushed out an earlier version tagged as X. I
 155then fixed something, and retagged the *fixed* tree as X again.
 156
 157If you got the wrong tag, and want the new one, please delete
 158the old one and fetch the new one by doing:
 159
 160        git tag -d X
 161        git fetch origin tag X
 162
 163to get my updated tag.
 164
 165You can test which tag you have by doing
 166
 167        git rev-parse X
 168
 169which should return 0123456789abcdef.. if you have the new version.
 170
 171Sorry for the inconvenience.
 172------------
 173
 174Does this seem a bit complicated?  It *should* be. There is no
 175way that it would be correct to just "fix" it automatically.
 176People need to know that their tags might have been changed.
 177
 178
 179On Automatic following
 180~~~~~~~~~~~~~~~~~~~~~~
 181
 182If you are following somebody else's tree, you are most likely
 183using remote-tracking branches (`refs/heads/origin` in traditional
 184layout, or `refs/remotes/origin/master` in the separate-remote
 185layout).  You usually want the tags from the other end.
 186
 187On the other hand, if you are fetching because you would want a
 188one-shot merge from somebody else, you typically do not want to
 189get tags from there.  This happens more often for people near
 190the toplevel but not limited to them.  Mere mortals when pulling
 191from each other do not necessarily want to automatically get
 192private anchor point tags from the other person.
 193
 194Often, "please pull" messages on the mailing list just provide
 195two pieces of information: a repo URL and a branch name; this
 196is designed to be easily cut&pasted at the end of a 'git fetch'
 197command line:
 198
 199------------
 200Linus, please pull from
 201
 202        git://git..../proj.git master
 203
 204to get the following updates...
 205------------
 206
 207becomes:
 208
 209------------
 210$ git pull git://git..../proj.git master
 211------------
 212
 213In such a case, you do not want to automatically follow the other
 214person's tags.
 215
 216One important aspect of git is its distributed nature, which
 217largely means there is no inherent "upstream" or
 218"downstream" in the system.  On the face of it, the above
 219example might seem to indicate that the tag namespace is owned
 220by the upper echelon of people and that tags only flow downwards, but
 221that is not the case.  It only shows that the usage pattern
 222determines who are interested in whose tags.
 223
 224A one-shot pull is a sign that a commit history is now crossing
 225the boundary between one circle of people (e.g. "people who are
 226primarily interested in the networking part of the kernel") who may
 227have their own set of tags (e.g. "this is the third release
 228candidate from the networking group to be proposed for general
 229consumption with 2.6.21 release") to another circle of people
 230(e.g. "people who integrate various subsystem improvements").
 231The latter are usually not interested in the detailed tags used
 232internally in the former group (that is what "internal" means).
 233That is why it is desirable not to follow tags automatically in
 234this case.
 235
 236It may well be that among networking people, they may want to
 237exchange the tags internal to their group, but in that workflow
 238they are most likely tracking each other's progress by
 239having remote-tracking branches.  Again, the heuristic to automatically
 240follow such tags is a good thing.
 241
 242
 243On Backdating Tags
 244~~~~~~~~~~~~~~~~~~
 245
 246If you have imported some changes from another VCS and would like
 247to add tags for major releases of your work, it is useful to be able
 248to specify the date to embed inside of the tag object; such data in
 249the tag object affects, for example, the ordering of tags in the
 250gitweb interface.
 251
 252To set the date used in future tag objects, set the environment
 253variable GIT_COMMITTER_DATE (see the later discussion of possible
 254values; the most common form is "YYYY-MM-DD HH:MM").
 255
 256For example:
 257
 258------------
 259$ GIT_COMMITTER_DATE="2006-10-02 10:31" git tag -s v1.0.1
 260------------
 261
 262include::date-formats.txt[]
 263
 264SEE ALSO
 265--------
 266linkgit:git-check-ref-format[1].
 267
 268GIT
 269---
 270Part of the linkgit:git[1] suite