Code

[PATCH] Add "git-update-ref" to update the HEAD (or other) ref
authorLinus Torvalds <torvalds@osdl.org>
Sun, 25 Sep 2005 18:43:05 +0000 (11:43 -0700)
committerJunio C Hamano <junkio@cox.net>
Sun, 25 Sep 2005 23:18:25 +0000 (16:18 -0700)
commit66bf85a462893f9df7e516a5f334dbba08122617
treece3cd9a0cece3301f499e284263434792629b96c
parent8cc01e5019e0dc9a86bba4cba414b46627fe0424
[PATCH] Add "git-update-ref" to update the HEAD (or other) ref

This is a careful version of the script stuff that currently just
blindly writes HEAD with a new value.

You can use

git-update-ref HEAD <newhead>

or

git-update-ref HEAD <newhead> <oldhead>

where the latter version verifies that the old value of HEAD matches
oldhead.

It basically allows a "ref" file to be a symbolic pointer to another ref
file by starting with the four-byte header sequence of "ref:".

More importantly, it allows the update of a ref file to follow these
symbolic pointers, whether they are symlinks or these "regular file
symbolic refs".

NOTE! It follows _real_ symlinks only if they start with "refs/":
otherwise it will just try to read them and update them as a regular file
(ie it will allow the filesystem to follow them, but will overwrite such a
symlink to somewhere else with a regular filename).

In general, using

git-update-ref HEAD "$head"

should be a _lot_ safer than doing

echo "$head" > "$GIT_DIR/HEAD"

both from a symlink following standpoint _and_ an error checking
standpoint.  The "refs/" rule for symlinks means that symlinks that point
to "outside" the tree are safe: they'll be followed for reading but not
for writing (so we'll never write through a ref symlink to some other
tree, if you have copied a whole archive by creating a symlink tree).

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
Makefile
update-ref.c [new file with mode: 0644]