views:

539

answers:

2

We are using Git with a central server, and our code needs to include a version number in a file. The way this is currently done is like this:

  1. A new developer does a "git clone"
  2. In his local copy, he edits .git/hooks/pre-commit to call version.sh

version.sh (which is included in the project root) takes a version number from "git describe" and stores it in a file.

While this works, I would like to make sure that the version number is updated even if a developer forgot to edit his pre-commit hook.

Since the server has no working copy, simply calling the (pre|post)-receive hooks there does not work, so I am wondering if there is a way to do this.

A: 

The x264 project automatically generates a version number by counting git commits in the history. It migrated from svn, where versions were actually called r678, for example, but someone cooked up a script to generate numbers from git.

http://git.videolan.org/?p=x264.git;a=blob;f=version.sh;hb=HEAD

Peter Cordes
+1  A: 

How about a hooks/update on the central repo that rejects commits without changes to the version file (named VERSION in the example below)?

#! /bin/bash

refname="$1"
oldrev="$2"
newrev="$3"

if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
  echo "Usage: $0 <ref> <oldrev> <newrev>" >&2
  exit 1
fi

if [ "$refname" != "refs/heads/master" ]; then
  exit 0
fi

if diff -bq <(git show $oldrev:VERSION) \
            <(git show $newrev:VERSION) >/dev/null
then
  echo "$0: VERSION unchanged; rejecting update" >&2
  exit 1
fi
Greg Bacon