Don't understand german? Read or subscribe to my english-only feed.

git: einen spezifischen Commit holen

Bei meiner Arbeit am grml-kernel heisst es natürlich auch Changelog studieren. Das Changelog für Linux-Kernel 2.6.15 wiegt 2.6MB, da ist aber noch kein Sourcecode drin. ;-) Natürlich gibt es aber einige Commits, die mich näher interessieren. Als Beispiel sowas wie:

commit d0be4a7d29ad0bd3ce2209dd9e46d410b632db59
Author: Christoph Hellwig <hch@lst.de>
Date:   Mon Oct 31 18:31:40 2005 +0100

    [SCSI] remove Scsi_Host_Template typedef                                                                                                        

    Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>

Wie aber kommt man jetzt an diesen einen Commit mit der nichts-aussagendenden ID ‘d0be4a7d29ad0bd3ce2209dd9e46d410b632db59’? Ich möchte keinen ganzen Tree klonen, da ich Kernelchanges an sich via RSS-Feed verfolge (siehe kernel.org/git/) und möglichst wenig Daten lokal halten will. Meine Lösung ist folgender Eintrag in der zshrc:

# get specific git commitdiff
  git-get-diff() {
    if [ -z $GITTREE ] ; then
      GITTREE='linux/kernel/git/torvalds/linux-2.6.git'
    fi
    if ! [ -z $1 ] ; then
     $BROWSER "http://kernel.org/git/?p=$GITTREE;a=commitdiff;h=$1"
    else
      echo "Usage: git-get-diff <commit>"
    fi
  }
# get specific git commit
  git-get-commit() {
    if [ -z $GITTREE ] ; then
      GITTREE='linux/kernel/git/torvalds/linux-2.6.git'
    fi
    if ! [ -z $1 ] ; then
     $BROWSER "http://kernel.org/git/?p=$GITTREE;a=commit;h=$1"
    else
      echo "Usage: git-get-commit <commit>"
    fi
  }

Mit einem ‘git-get-commit d0be4a7d29ad0bd3ce2209dd9e46d410b632db59’ bekomm ich jetzt den Commit selbst, den Patch/Diff sehe ich dann mit ‘git-get-diff d0be4a7d29ad0bd3ce2209dd9e46d410b632db59’. Tut genau was ich will.

Da das vermutlich auch für andere Leute nützlich sein könnte, wandert das mal in /etc/skel/.zshrc von grml und wird mit der nächsten Release ausgeliefert. Works-for-me, works-for-you. ;-)

PS: Ich stehe mit git ein wenig auf Kriegsfuß, falls jemand eine elegantere Variante (sei es direkt via git oder cogito) kennen sollte: her damit!

3 Responses to “git: einen spezifischen Commit holen”

  1. Tobias Klauser Says:

    Evtl. noch ein Kommando, um den plaintext commitdiff direkt auf die Festplatte zu holen (ohne Browser):

    git-get-plaindiff() {
    if [ -z $GITTREE ] ; then
    GITTREE=’linux/kernel/git/torvalds/linux-2.6.git’
    fi
    if ! [ -z $1 ] ; then
    wget “http://kernel.org/git/?p=$GITTREE;a=commitdiff_plain;h=$1” -O $1.diff
    else
    echo “Usage: git-get-plaindiff ”
    fi
    }

    U.u. musst du aufpassen, dass die Shell-Funktionen nicht den selben (oder ähnliche) Namen haben, wie die git-Tools.

  2. mika Says:

    @tklauser:

    git-get-plaindiff – gekauft und integriert :-)

    > U.u. musst du aufpassen, dass die Shell-Funktionen nicht den
    > selben (oder ähnliche) Namen haben, wie die git-Tools.

    Jupp, hab ich gemacht. Deswegen heisst es ‘git-get-$KEYWORD’ :)

  3. Tobias Klauser Says:

    @mika:

    OK, ich hatte die Namen nicht mehr wirklich im Kopf, da git auf der Kommandozeile schon länger nicht mehr benutzt. ;-)