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