Git alternatives to "svn info" that can be included in a build for traceability?

Git

Git Problem Overview


I'm looking for a Git alternatives to "svn info".

Today I added some information that Subversion gives me with the "svn info" command right into my build, and that is then pushed into a source file that prints this during startup. That way I always know where that build came from and how to get it back again.

If you have "svn info" like URL, Repository Root, Repository UUID and the Revision, you have a good link between what is deployed and the buildsystem. And if someone reports a bug you know where that software came from, and since that information was automatically included, the risk of human error is smaller.

Now the question is, what information do I need to get from Git so I can later identify where that build came from? And how do I use that information to switch back to exactly that version?

(Maybe I need to add some information about the "build computer" as well since Git is distributed.)


Update: Using rev-parse was really useful, and I got something like this:

cj@zap:~/git_test$ git rev-parse HEAD
72ce5f3e13c61f76fde5c58cefc85eed91b6f1f8

And with that magic number it is later possible to do:

cj@zap:~/git_test$ git checkout 72ce5f3e13c61f76fde5c58cefc85eed91b6f1f8

And I am back where I was.


Update: I think that if I take some parts from that scripts VonC provided and put them into my buildfile I will get the result I was looking for.


Update:

A note on "git describe". You need a real tag (tag -a) earlier in you branch history to make this work or you will get something like this.

fatal: cannot describe '72ce5f3e13c61f76fde5c58cefc85eed91b6f1f8'

The problem is also described in Git Tag Does the Wrong Thing by Default.

But please note that a checkout seems to work anyway, even though that was an error message.

git checkout 72ce5f3e13c61f76fde5c58cefc85eed91b6f1f8

The normal thing though seems to be that you create something like a "ver1.0" tag, and then if you continue to work you get something like this:

cj@zap:~/git_test$ git describe 
ver1.0-2-g4c7a057
cj@zap:~/git_test$ git tag -a ver2.0
cj@zap:~/git_test$ git describe 
ver2.0
cj@zap:~/git_test$ git commit . -m "something..."
Created commit ac38a9d: something...
 1 files changed, 1 insertions(+), 0 deletions(-)
cj@zap:~/git_test$ git describe 
ver2.0-1-gac38a9d

So when you use describe correctly it does work and may produce a more human-readable results, and it can be really useful as well.

Git Solutions


Solution 1 - Git

I know the answer is already accepted but this may help someone who is looking for remote and branch information.

 git remote show origin

Solution 2 - Git

To complete Charles's answer, you also can make a script displaying "sn info" like information, like this one (already mentioned there)

#!/bin/bash

# author: Duane Johnson
# email: [email protected]
# date: 2008 Jun 12
# license: MIT
# 
# Based on discussion at http://kerneltrap.org/mailarchive/git/2007/11/12/406496

pushd . >/dev/null

# Find base of git directory
while [ ! -d .git ] && [ ! `pwd` = "/" ]; do cd ..; done

# Show various information about this git directory
if [ -d .git ]; then
  echo "== Remote URL: `git remote -v`"

  echo "== Remote Branches: "
  git branch -r
  echo

  echo "== Local Branches:"
  git branch
  echo

  echo "== Configuration (.git/config)"
  cat .git/config
  echo

  echo "== Most Recent Commit"
  git --no-pager log  -n1
  echo

  echo "Type 'git log' for more commits, or 'git show' for full commit details."
else
  echo "Not a git repository."
fi
---
popd >/dev/null

Which would produce something like:

== Remote URL: origin [email protected]:canadaduane/my-project.git
== Remote Branches:
  origin/work
  trunk
  trunk@1309
  trunk@2570
  trunk@8

== Local Branches:
  master
* work

== Configuration (.git/config)
[core]
  repositoryformatversion = 0
  filemode = true
  bare = false
  logallrefupdates = true
[svn-remote "svn"]
  url = svn+ssh://svn.my-project.com/srv/svn
  fetch = my-project/trunk:refs/remotes/trunk
[remote "origin"]
  url = [email protected]:canadaduane/my-project.git
  fetch = refs/heads/*:refs/remotes/origin/*
[github]
  user = canadaduane
  repo = my-project

== Most Recent Commit
commit b47dce8b4102faf1cedc8aa3554cb58d76e0cbc1
Author: Duane Johnson <[email protected]>
Date:   Wed Jun 11 17:00:33 2008 -0600

    Added changes to database schema that will allow decentralization from content pointers table

type 'git log' for more, or 'git show' for full commit details.

Solution 3 - Git

In git, the commit id is unique in a project even across distibuted code. You can also checkout a commit id, so if you want an identifier than will enable you to get back to the state of the code that generated a build you just need the commit id.

git rev-parse HEAD

Of course, you probably want to be sure that there aren't any pending changes in the working tree or index so you might want to check that there's no output to something like this:

git diff --name-status HEAD

or just use the exit code of:

git diff --quiet HEAD

The only things that you might want to record about the build machine are environmental factors such as tool chain versions and what state any tools that didn't come from the repository were in.

If you have a central master repository you could record the url of that, although as the commit id is unique across all clones of the project it's not critical information for identifying the commit.

Solution 4 - Git

You can get the remote info like we get in 'svn info' by:

git remote -v

Solution 5 - Git

git describe

is all you need. Just make sure you've created at least one (proper) tag.

Solution 6 - Git

I don't know if this is what you want, but if you want to embed some kind of version info during build time, tag your point releases, and take a look how Git itself does it (Linux kernel uses the same mechanism) using Makefile and GIT-VERSION-GEN script (both links are to gitweb at repo.or.cz).

GIT-VERSION-GEN in turn uses [git-describe][git-describe].

[git-describe]: http://www.kernel.org/pub/software/scm/git/docs/git-describe.html "git-describe - Show the most recent tag that is reachable from a commit"

Solution 7 - Git

Here's gitinfo.ps1 (or Get-GitInfo.ps1 for the purists), a PowerShell version of Duane Johnson's shell script:

# From http://stackoverflow.com/a/924657/990504
# Duane Johnson's script translated to PowerShell by Jonathan Fischer 2015.04.25

Push-Location .

# Find base of git directory
while ( $true )
{
  if ( Test-Path -PathType container .git )
  {
    # Show various information about this git directory
    Write-Output "== Remote URL: $(git remote -v)"

    Write-Output "`n== Remote Branches: "
    git branch -r

    Write-Output "`n== Local Branches:"
    git branch

    Write-Output "`n== Configuration (.git/config)"
    Get-Content .git/config

    Write-Output "`n== Most Recent Commit"
    git log --max-count=1

    Write-Output "Type 'git log' for more commits, or 'git show' for full commit details."
    break
  }

  # Try parent directory.
  Set-Location ..
  # Stop if at root of drive.
  if ( (Get-Location).Path -match "[A-Z]:\\$" )
  {
    Write-Error "Not a Git repository."
    break
  }
}

# Note: even though the popd was not strictly necessary in the bash version
# unless the script was sourced/dotted, PowerShell has the questionable behavior
# where scripts modify the current directory (and environment!) of the calling
# process. So we need the Pop-Location.
Pop-Location

Solution 8 - Git

You can create an alias in git.

git config --global alias.info 'rev-parse HEAD'

Then you can use same command in git,

git info

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJohanView Question on Stackoverflow
Solution 1 - GitWebghostView Answer on Stackoverflow
Solution 2 - GitVonCView Answer on Stackoverflow
Solution 3 - GitCB BaileyView Answer on Stackoverflow
Solution 4 - GitNandan AView Answer on Stackoverflow
Solution 5 - GitDustinView Answer on Stackoverflow
Solution 6 - GitJakub NarębskiView Answer on Stackoverflow
Solution 7 - GitJonathan FischerView Answer on Stackoverflow
Solution 8 - GithkaraogluView Answer on Stackoverflow