So binden Sie Bash-Skripte direkt in einen Git-Alias ​​ein

82

Kann ich den folgenden Bash-Shell-Code einbetten:

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

direkt in die Erstellung eines Git-Alias:

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

Dies führt zu meiner vorherigen Frage / Antwort zu SO, wo ich den Code in eine .sh-Datei eingefügt und dann auf die Datei ausgerichtet habe:

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

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

Seba Illingworth
quelle

Antworten:

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

Dies ist in einer Hinsicht redundant. Wenn Sie ohnehin 'diffall.sh' zu Ihrem $ PATH hinzufügen möchten, speichern Sie es als 'git-diffall' und sparen Sie sich das Deklarieren eines Alias. Ja, "git diffall" wird es ausführen.

u0b34a0f6ae
quelle
1
Das. Ist toll. Ich hatte anfangs Angst, dass ich versehentlich etwas ausführen würde, da ich ein paar Shell-Skripte geschrieben habe, um Git-Sachen zu machen, und ihnen das Präfix 'git-' gegeben habe, aber meine Shell (zsh) vervollständigt sie nicht automatisch, also würde ich müssen sie explizit eingeben. Und wenn ich das Verhalten der automatischen Vervollständigung möchte, kann ich einen Git-Alias ​​für einen eigenen Unterbefehl deklarieren. Dies ist auch eine Voraussetzung dafür, dass ich den Link vom Skript zum Unterbefehl explizit mache.
Jon Carter
1
Ja, und es ist eine Binärdatei, Sie brauchen nur den Knall:! binary
1
Funktioniert bei mir nicht, die Verwendung innerhalb eines Alias !sh git checkout $(git log --branches -1 --pretty=format:'%D' | sed 's/.*, //g')führt zu /usr/lib/git-core/git: /usr/lib/git-core/git: cannot execute binary file. Versuchte es sham Anfang sowohl mit als auch ohne .
Hi-Angel
36

Um Befehle innerhalb eines Git-Alias ​​auszuführen und insbesondere Argumente an diese Befehle zu übergeben, müssen Sie wahrscheinlich 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 genau das, was Sie benötigen (und sie ist auch flexibler, was Sie in einer einzelnen "Anweisung" tun können). und Sie können wahrscheinlich feststellen, dass für beide Optionen die verbleibenden Argumente an den Befehl git einfach als Argumente an den Alias ​​übergeben werden, unabhängig davon, ob es sich um "echo" oder "f" handelt. Das Aufrufen der Funktion verbraucht einfach die Argumente und ignoriert, 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 basierend auf dem übereinstimmenden Muster auf) (Hinweis: Sie können den gleichen Funktionsnamen "f ()" in der gesamten .gitconfig weiterhin verwenden):

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

Der erste gibt den Alias ​​für nur "foo $" zurück, der 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 können je nach Shell variieren. Ich verwende dies mit Bash unter Linux, Unix und Cygwin (Windows).)

Michael
quelle
git.wiki.kernel.org/index.php/Aliases#What.27s_new.3F empfiehlt implizit die Verwendung sh -c. Auf diese Weise müssen Sie sich keine Gedanken über die Anmeldeshell des Benutzers machen.
Clacke
Die von mir bereitgestellte Funktionssyntax ist absichtlich auf einige Shells (sh / ksh / bash / zsh) portierbar und schneller als das Starten eines Unterprozesses. Ich würde empfehlen, weiterhin die Funktionssyntax zu verwenden, es sei denn, es gibt ein bestimmtes Portabilitätsproblem auf einer bestimmten Plattform.
Michael
Ihr Kommentar brachte mich zurück zu dieser Antwort, und ich werde wahrscheinlich Ihren Weg benutzen. Es spart eine Ebene des Zitats, und diese Ebenen sind verrückt genug, wie es ist. :-)
Clacke
Dies sieht aus wie ein schöner Artikel, der beschreibt, was Sie tun: atlassian.com/blog/git/advanced-git-aliases
Gabriel Staples
Hinweis: Ich habe hier eine Folgefrage zu dieser Antwort gestellt: stackoverflow.com/questions/52123145/… . "So ersetzen Sie interne Git-Befehle, z. B. git statusdurch benutzerdefinierte Aliase"
Gabriel Staples,
24

Ich konnte es 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.

Sehen:

$ 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 <my@Laptop.(none)>
| Date:   Fri Apr 1 16:47:20 2011 +0200
| 
|     would have been better not to do it at all
| 
...
$

Sie können also auch auf diese (eher dunkle) Weise einen beliebigen Alias ​​schreiben.

Darüber hinaus können Sie diesem neuen Befehl, der eine Funktion definiert, die automatische Vervollständigung hinzufügen. Infos hier

$ _git_logg ()
{
  # you can return anything here for the autocompletion for example all the branches
  __gitcomp_nl "$(__git_refs)" 
}
Albfan
quelle
+1, dachte, es würde nur aus dem git libexec Ordner funktionieren.
Vielen
14

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

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

Bearbeiten: Vermutlich funktioniert auch die git-config-Version, aber ich möchte meine Aliase zur einfacheren Verwaltung in der Konfigurationsdatei behalten.

Es gibt eine schöne Seite im Git-Wiki, die Aliase sehr klar erklärt: http://git.or.cz/gitwiki/Aliases Lesen Sie insbesondere "Erweiterte Aliase mit Argumenten".

David Claridge
quelle
git config --global speichert Ihre Aliase in $ HOME / .gitconfig, wo sie (IMO) noch einfacher zu verwalten sind. Fast keine Aliase müssen repository-spezifisch sein. (Repo spezifisch gehen in repo / .git / config)
u0b34a0f6ae
Danke David, aber es wird einfach nicht für mich funktionieren - das oder eine der Variationen des großartigen Links, den Sie aufgenommen haben. Vielleicht hätte ich erwähnen sollen, dass ich in einer Windows-Umgebung laufe? Danke Kaizer, stimmte zu, das ist 'global' für mich.
Seba Illingworth
In diesen Tagen, git.wiki.kernel.org/index.php/Aliases#Advanced ist ein guter Ort zu suchen. (Der Git- oder CZ-Link leitet dort weiter, aber in diesem Abschnitt wird insbesondere erwähnt, dass komplexe Dinge mit Argumenten ausgeführt werden.)
Clacke
-4

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

Haben Sie versucht, ein Skript in .git / hooks hinzuzufügen?

Wenn Sie beispielsweise ein Skript .git / hooks / post-checkout erstellen:

#!/bin/bash

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

Führen Sie dann den folgenden Befehl aus:

$ git checkout master
Switched to branch 'master'
This is run after a 'git checkout'
Denian
quelle
3
Was haben Hooks mit Konfiguration, Erweiterungen und Aliasnamen zu tun?
Steve Buzonas