I want to add the current git revision number to the the binary built by go build
so that I can do something like ./mybinary --revision
to see which revision it is built from (usually for troubleshooting later on after deployment). Obviously I cannot put the revision number into the source since that will change the source with a new revision. I'm wondering if there is any other way to do this? Or do you think this is just a bad idea? If so, what's the recommended way to establish the relation between built binaries and its source version? Version numbers do not seem to be a good idea with a distributed version control system.
If you can get the git revision into $VERSION and have a variable named version
(type string) in your main package, you can set it during the build with:
#!/bin/sh
VERSION=`git log | head -n 1 | cut -f 2 -d ' '`
go build -ldflags "-X main.version=$VERSION" myfile.go
You would generally use tags (also known as labels in other version control systems) to note the files that make up a particular build. http://git-scm.com/book/en/Git-Basics-Tagging. I typically make tags that include the version and build date. For example v1.2_29Mar2013. If I have several products that can be built from the same code base I'll include something to identify which product.
For all and any versioned in Git code most obvious way for getting identification-string for any changeset (while I leave to you task of displaying this string on --revision
options) is
I'd create a version.go
file with a single var version string
and then process that before a call to go build
and reset it after. In other words, go doesn't support any type of code generation so you'll need to rely on something external to do this.