Ich versuche, einen Alias zu erstellen, der sowohl mehrere Git-Befehle als auch Positionsparameter verwendet. Es gibt Stackoverflow-Seiten für jede Seite, und es scheint schmerzlich offensichtlich, beides zu tun, aber ich habe Probleme.
Als Beispiel möchte ich zu Branch Foo wechseln und einen Status ausführen. Also in meinem habe .gitconfig
ich:
[alias]
chs = !sh -c 'git checkout $0 && git status'
was nicht funktioniert. Während so etwas funktionieren wird.
chs = !sh -c 'git checkout $0'
echoes = !sh -c 'echo hi && echo bye'
Jeder Einblick wäre dankbar.
Antworten:
Dies wird funktionieren (getestet mit zsh und bash):
quelle
git chs foo
ingit checkout && git status foo
echo $1 && echo done
gibt beim Aufrufen mit dem Argument 'foo' sowohl "foo" als auch "done foo" aus.git
?!
Mittel das Ganze an die Shell weiter. Andernfalls wird davon ausgegangen, dass Sie versuchen, einen anderen git-Befehl auszuführen, und dieser als Argumente an diegit
Binärdatei übergeben.;:
anstatt&& :
. Und das funktioniert auch unter Unix.Dies zielt auf Windows Batch / Msysgit Bash ab. funktioniert möglicherweise nicht in anderen Umgebungen.
Wie Olivier Verdier und Lily Ballard gesagt haben
[alias] chs = !git checkout $1 && git status
funktioniert fast, gibt aber eine falsche zusätzliche Einfügung des Arguments ...
git chs demo -> git checkout demo && git status demo
Wenn Sie
&& :
jedoch das Ende Ihres Alias hinzufügen , wird das falsche Argument in ein Standort-Tag umgewandelt.So
gibt die richtige Ausgabe ...
git chs demo -> git checkout demo && git status
quelle
&& :
ist Gold und lässt diese Lösung für Befehle funktionieren, bei denen das zusätzliche Argument problematisch wäre.&& :
bedeutet?a=123;$a
Fehler, abera=123; : $a
nicht. 2.: > hello.txt
leert hello.txt. 3.if [ "$a" = "hello" ];then : ;fi
läuft in Ordnung, aber Fehler ohne ':'. Es ist wiepass
in Python. 4.: this is a comment
Der Doppelpunkt gefolgt von einem Leerzeichen funktioniert wie#
in einer Kommentarzeile.co = !git checkout public/compiled && git checkout $1
und wenn ich es tungit co master
würde, würde ich die Nachricht erhaltenerror: pathspec 'master' did not match any file(s) known to git.
. Ich dachte nicht, dass diese Antwort für mich nützlich wäre, weil das erste, was darin erwähnt wird, Windows ist und ich unter Linux bin. Aber du hast erklärt warum.Sie können eine Shell-Funktion definieren.
quelle
"
Ich konnte mehrzeilige und recht komplexe Git-Aliase erstellen. Sie funktionieren gut unter Windows, aber ich gehe davon aus, dass sie auch anderswo funktionieren würden, zum Beispiel:
Ich schrieb einen Beitrag und haben ein paar weitere Beispiele hier .
quelle
!f() { : reset
, um Vervollständigungen vom Rücksetzbefehl github.com/git/git/blob/master/contrib/completion/… zu erhaltenquelle
!
?!
aber soweit ich git sehen kann, wird standardmäßig davon ausgegangen, dass der Alias ein git-Befehl ist, sodass diest = status
funktioniert. Wenn Sie es jedoch versuchent = git status
, funktioniert es nicht (der Befehl "git" wurde nicht gefunden). So dass , wenn das!
hereinkommt, sagt er es den Befehl auszuführen , als ob es sich um eine Schale war, und in der Regel müssen Sie dies , wenn Sie mehrere git Befehle pro Alias haben, so haben Sie könnent = !git status && git log
zum Beispiel und es wird funktionieren.Probier diese:
Nennen Sie es so:
git chs master
quelle
Es ist möglich, einen mehrzeiligen Git-Alias zu haben, indem
\
am Ende jeder Zeile angehängt wird.quelle
"!git fetch --prune --all; git pull --rebase upstream master; git push origin master"
meinen Alias zu verwenden.Das Problem hierbei ist, dass die Positionsparameter anscheinend zweimal an den Shell-Befehl gesendet werden (ab Git 1.9.2). Um zu sehen, was ich meine, versuchen Sie Folgendes:
Dann tu es
git test this is my testing string
. Sie sollten die folgende Ausgabe beachten (die letzten beiden Zeilen wurden hier zur Verdeutlichung bearbeitet):Eine Möglichkeit, dies zu umgehen, wäre:
Dies verbraucht den zusätzlichen Positionsparameter, wenn er auf diesen letzten Echobefehl angewendet wird, und hat keine Auswirkung auf die Ergebnisse.
quelle