Ich bin gerade auf etwas Ähnliches gestoßen; Ich hoffe, es ist OK, meine Notizen zu posten. Eine Sache, die mich über gitAliase mit Argumenten verwirrt , kommt wahrscheinlich von git help config(ich habe Git-Version 1.7.9.5):
Wenn der Alias-Erweiterung ein Ausrufezeichen vorangestellt wird, wird sie als Shell-Befehl behandelt. Wenn Sie beispielsweise "alias.new =! Gitit --all --not ORIG_HEAD" definieren, entspricht der Aufruf "git new" dem Ausführen des Shell-Befehls "gitk --all --not ORIG_HEAD". Beachten Sie, dass Shell-Befehle aus dem Verzeichnis der obersten Ebene eines Repositorys ausgeführt werden, das nicht unbedingt das aktuelle Verzeichnis sein muss. [...]
So wie ich es sehe - wenn ein Alias "als Shell-Befehl behandelt wird", wenn ein Ausrufezeichen vorangestellt wird - warum sollte ich eine Funktion oder sh -cArgumente verwenden müssen? Warum schreibst du meinen Befehl nicht einfach so wie er ist?
Ich weiß die Antwort immer noch nicht - aber ich denke tatsächlich, dass es einen kleinen Unterschied im Ergebnis gibt. Hier ist ein kleiner Test - werfen Sie diesen in Ihren .git/configoder Ihren ~/.gitconfig:
[alias]
# ...
ech = "! echo rem: "
shech = "! sh -c 'echo rem:' "
fech = "! f() { echo rem: ; }; f " # must have ; after echo!
echargs = "! echo 0[[\"$0\"]] 1-\"$1\"/ A-"$@"/ "
fechargs = "! f() { echo 0[[\"$0\"]] 1-\"$1\"/ A-"$@"/ ; }; f "
Folgendes bekomme ich, um diese Aliase auszuführen:
$ git ech word1 word2
rem: word1 word2
$ git shech word1 word2
rem:
$ git fech word1 word2
rem:
$ git echargs word1 word2
0[[ echo 0[["$0"]] 1-"$1"/ A-$@/ ]] 1-word1/ A-word1 word2/ word1 word2
$ git fechargs word1 word2
0[[ f() { echo 0[["$0"]] 1-"$1"/ A-$@/ ; }; f ]] 1-word1/ A-word1 word2/
... oder: Wenn Sie einen "einfachen" Befehl nach dem !"wie besehen " in einem gitAlias gitverwenden, wird die Argumentliste automatisch an diesen Befehl angehängt! Eine Möglichkeit, dies zu vermeiden, besteht darin, Ihr Skript entweder als Funktion oder als Argument für aufzurufen sh -c.
Eine andere interessante Sache hier (für mich) ist, dass man in einem Shell-Skript normalerweise erwartet, dass die automatische Variable $0der Dateiname des Skripts ist. Bei einer gitAlias-Funktion ist das $0Argument im Grunde genommen der Inhalt der gesamten Zeichenfolge, die diesen Befehl angibt (wie in der Konfigurationsdatei eingegeben).
Aus diesem Grund, denke ich, wenn Sie zufällig falsch zitieren - im folgenden Fall würde dies den äußeren doppelten Anführungszeichen entgehen:
[alias]
# ...
fail = ! \"echo 'A' 'B'\"
... - dann gitwürde mit (zumindest für mich) etwas kryptischer Nachricht scheitern:
$ git fail
"echo 'A' 'B'": 1: echo 'A' 'B': not found
fatal: While expanding alias 'fail': ' "echo 'A' 'B'"': No such file or directory
Ich denke, da giteine ganze Zeichenfolge nur als ein Argument "gesehen" wurde !, wurde versucht, sie als ausführbare Datei auszuführen. und dementsprechend konnte es nicht "echo 'A' 'B'"als Datei gefunden werden.
In jedem Fall git help configwürde ich im Zusammenhang mit dem obigen Zitat spekulieren, dass es genauer ist, Folgendes anzugeben : " ... der Aufruf" git new "entspricht dem Ausführen des Shell-Befehls" gitk --all --not ORIG_HEAD " $ @ ", wobei $ @ die Argumente sind, die zur Laufzeit von der Befehlszeile an den git-Befehlsalias übergeben werden. ... ". Ich denke, das würde auch erklären, warum der "direkte" Ansatz in OP nicht mit Positionsparametern funktioniert.
$1sollte funktionieren).