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!
January 10th, 2006 at 12:09
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.
January 10th, 2006 at 12:18
@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’ :)
January 10th, 2006 at 12:27
@mika:
OK, ich hatte die Namen nicht mehr wirklich im Kopf, da git auf der Kommandozeile schon länger nicht mehr benutzt. ;-)