2009-08-20 2 views
63

Kann ich den folgenden Bash-Shell-Code einbetten:Wie Bash-Skript direkt in einem Git-Alias ​​einzubetten

for name in $(git diff --name-only $1); do git difftool $1 $name & done 

direkt in die Schaffung eines git alias:

git config --global alias.diffall ***my-bash-code-here*** 

Dies führt aus meinem previous question/answer auf SO, wo ich den Code in eine .sh Datei setzen und dann auf die Datei Alias:

git config --global alias.diffall '!sh diffall.sh' 

Aber in der nev Wenn es nach Einfachheit geht, muss es eine Möglichkeit geben, die Datei zu überspringen und Code direkt in den Alias ​​einzufügen. Ich kann das Format nicht herausfinden ...

Antwort

70
git config --global alias.diffall '!sh diffall.sh' 

Dies ist überflüssig, in einer Art und Weise. Wenn du 'diffall.sh' trotzdem in deinen $ PATH hinzufügen willst, dann speichere es als 'git-diffall', und rette dich davor, einen Alias ​​zu deklarieren. Ja, "git diffall" wird es ausführen.

+0

Das. Ist toll. Ich machte mir zunächst Sorgen, dass ich versehentlich etwas ausführen würde, da ich ein paar Shell-Skripte geschrieben habe, um git-Zeug zu machen, und ihnen das Präfix 'git-', Aber meine Shell (zsh) vervollständigt sie nicht, also müsste ich sie explizit eingeben. Und wenn ich Autocomplete-Verhalten haben möchte, kann ich einen Git-Alias ​​für seinen eigenen Unterbefehl deklarieren, was auch eine Voraussetzung ist, dass ich die Verknüpfung von Skript zu Unterbefehl explizit mache. –

+0

Yup, und es ist eine binäre Sie brauchen nur den Knall: '! binary' –

13

Das Hinzufügen dieser 2 Zeile zu Ihrer .git/config-Datei sollte den Trick machen.

[alias] 
    diffall = '!for name in $(git diff --name-only $1); do git difftool $1 $name & done' 

Edit: vermutlich die git-config-Version funktioniert auch, aber Ich mag meine Aliase in der Config-Datei halten für eine einfache Verwaltung.

Es gibt eine schöne Seite auf dem git Wiki, die Aliase sehr deutlich erklärt: http://git.or.cz/gitwiki/Aliases Insbesondere lesen ‚erweitert Aliase mit Argumenten‘

+0

git config --global speichert Ihre Aliase auf $ HOME/.gitconfig, wo (IMO) sie noch einfacher zu verwalten sind; Fast keine Aliase müssen repository-spezifisch sein. (Repo spezifisch gehe in Repo/.git/config) – u0b34a0f6ae

+0

Danke David, aber es wird einfach nicht für mich funktionieren - das oder irgendeine der Variationen in der großen Verbindung, die du eingeschlossen hast. Vielleicht hätte ich erwähnen sollen, dass ich in Windows-Umgebung laufe? Danke Kaizer, einverstanden, das ist "global" für mich. –

+0

In diesen Tagen ist https://git.wiki.kernel.org/index.php/Aliases#Advanced ein guter Ort, um zu schauen. (Der git oder cz Link leitet dort weiter, aber dieser Abschnitt erwähnt insbesondere das Ausführen komplexer Dinge mit Argumenten) – clacke

20

Ich konnte nicht in der Dokumentation finden, aber wenn Sie ein Skript "git-< Name>" im Pfad erstellen, können Sie es mit "Git-Name" in Ihrem Repo aufrufen.

See: zu

$ cd ~/bin 
$ echo "echo I love this log: 
>pwd 
>git log --graph --summary --decorate --all" > git-logg 
$ chmod +x git-logg 
$ cd /path/to/your/repo 
$ git logg 
I love this log: 
/path/to/your/repo 
* commit 3c94be44e4119228cc681fc7e11e553c4e77ad04 (whatever-branch) 
| Author: myself <[email protected](none)> 
| Date: Fri Apr 1 16:47:20 2011 +0200 
| 
|  would have been better not to do it at all 
| 
... 
$ 

So können Sie einen beliebigen Alias ​​Sie mit diesem (ziemlich dunkel) gefällt, wie schreiben.

Noch mehr können Sie diesem neuen Befehl, der eine Funktion definiert, Autovervollständigung hinzufügen. here Info

$ _git_logg() 
{ 
    # you can return anything here for the autocompletion for example all the branches 
    __gitcomp_nl "$(__git_refs)" 
} 
+0

+1, dachte, es würde nur aus dem Ordner git libexec funktionieren. Danke, dass Sie diesen Tipp teilen –

-3

(Von ProGit Dokumentation: http://progit.org/book/ch7-3.html)

Haben Sie versucht, ein Skript in .git/Haken hinzufügen?

Zum Beispiel, wenn Sie ein Skript erstellen.git/hooks/post-Kasse:

#!/bin/bash 

echo "This is run after a 'git checkout'" 

und dann den Befehl ausführen:

$ git checkout master 
Switched to branch 'master' 
This is run after a 'git checkout' 
+3

Was haben Hooks mit Konfiguration, Erweiterungen und Aliasen zu tun? –

20

Um Befehle innerhalb eines git alias zu laufen, insbesondere Argumente auf diese Befehle zu übergeben, werden Sie wahrscheinlich haben eine temporäre Funktion erstellen, die Sie dann sofort aufrufen:

$ vim ~/.gitconfig 
... 
[alias] 
    # compare: 
    foo = "! echo begin arg=$1/$2/end" 
    foo2 = "!f() { echo "begin arg=$1/$2/end"; }; f" 

in diesem Beispiel ist die Funktion wahrscheinlich das, was Sie brauchen (und ist auch flexibler, was Sie in einem einzigen „stat tun können "); und Sie können wahrscheinlich sagen, dass für beide Optionen die verbleibenden Argumente für den Git-Befehl einfach als Argumente an den Alias ​​übergeben werden, unabhängig davon, ob es "echo" oder "f" ist; Aufruf der Funktion verbraucht einfach die args, zu ignorieren, was nicht explizit verwendet wird:

$ git foo a b c 
begin arg=a/b/end a b c 

$ git foo2 a b c 
begin arg=a/b/end 

Ein weiteres Beispiel (listet alle Aliase, bezogen auf passende Muster) (Anmerkung: Sie halten die gleiche Funktion Namen „f()“ im gesamten Wiederverwendung die .gitconfig):

[alias] 
    alias = "!f() { git config --get-regexp "^alias.${1}$" ; }; f" 

die ersten kehrt den Alias ​​für nur "$ foo", die zweite für "foo. *":

$ git alias foo 
alias.foo ! echo begin arg=$1/$2/end 

$ git alias 'foo.*' 
alias.foo ! echo begin arg=$1/$2/end 
alias.foo2 !f() { echo begin arg=$1/$2/end; }; f 

(nb: die tatsächlichen Ergebnisse, basierend auf Shell variieren kann ; Ich benutze Dies mit Bash unter Linux, Unix & Cygwin (Windows).)

+0

https://git.wiki.kernel.org/index.php/Aliases#What.27s_new.3F empfiehlt implizit die Verwendung von 'sh -c', damit Sie sich keine Gedanken darüber machen müssen, was die Login-Shell des Benutzers ist. – clacke

+0

Die Funktionssyntax, die ich zur Verfügung gestellt habe, ist absichtlich über einige Shells (sh/ksh/bash/zsh) portierbar und wird schneller sein als das Starten eines Subprozesses. Ich würde empfehlen, immer noch die Funktionssyntax zu verwenden, es sei denn, es gibt ein spezifisches Portabilitätsproblem auf einer bestimmten Plattform. – michael

+0

Ihr Kommentar brachte mich zu dieser Antwort zurück und ich werde wahrscheinlich Ihren Weg benutzen. Es spart eine Ebene des Zitats, und diese Ebenen sind verrückt genug, wie es ist. :-) – clacke