Wie kann ich einen Alias ​​für einen git [action] -Befehl erstellen (der Leerzeichen enthält)?

29

Die meisten meiner Aliasnamen haben folgende Form: alias p='pwd'

Ich möchte einen Alias, git commitdamit es funktioniertgit commit -v

Beim Versuch, einen Alias ​​mit einem Leerzeichen zu erstellen, tritt jedoch ein Fehler auf:

$ alias 'git commit'='git commit -v'
-bash: alias: `git commit': invalid alias name
Michael Durrant
quelle

Antworten:

31

Keine direkte Antwort auf Ihre Frage (da Aliase nur aus einem Wort bestehen können), sondern git-configstattdessen Folgendes verwenden:

git config --global alias.civ commit -v

Dadurch wird ein Git-Alias ​​erstellt, git civder ausgeführt wird git commit -v. Leider ist es AFAIK nicht möglich, vorhandene git-Befehle mit Aliasen zu überschreiben . Sie können jedoch jederzeit einen geeigneten Aliasnamen auswählen, mit dem Sie als Alternative leben möchten.

jw013
quelle
Siehe Anmerkung hinzugefügt, um über git confignicht zu antwortengit-config
Michael Durrant
Da diese Antwort auf den Thread , dass Sie verknüpft macht deutlich, es ist möglich , bestehende zu überschreiben gitBefehle mit Aliasnamen, mit nur ein wenig von Shell - Skript. (Ich poste diesen Kommentar nicht als Kritik, BTW. Diese Antwort wurde fast ein Jahr nach Ihrer gepostet! Ich
poste
17

Sie sprechen von einem Befehl, der ein Leerzeichen enthält, aber hier ist der Befehl gitund es ist kein Leerzeichen enthalten.

Um einen git commit- Befehl aufzurufen , müssten Sie ihn schreiben

git\ commit ...
'git commit' ...
"git commit" ...

Im Allgemeinen enthalten Befehle in ihren Namen kein Leerzeichen, weshalb es umständlich ist, sie in einer Shell aufzurufen. Ich glaube daher, dass Sie einen solchen Befehl nicht auf Ihrem System finden.

Mit csh, tcsh oder zsh können Sie einen der oben genannten Aliasnamen vergeben, nicht jedoch mit bash oder ksh (obwohl pdksh dies zulässt, aber Sie nicht zulassen, dass Sie sie verwenden). In zsh:

alias "'git commit'=git commit -v"
'git commit' ...

Macht den git commandBefehl (wenn er nur als 'git command'(mit einfachen Anführungszeichen) aufgerufen wird ) zu einem Alias ​​für den gitBefehl mit den Argumenten commitund -v. Nicht das, wonach du gesucht hast, würde ich allerdings raten.

Da aliasnur Aliasbefehle möglich sind , können Sie hier nur den gitBefehl als Alias ​​verwenden , und Sie müssen einen Alias ​​für etwas festlegen, das ein "-v" nach "commit" in die Liste der Argumente einfügt. Am besten mit der Lösung von @ jw013, aber wenn Sie aus irgendeinem Grund keinen Alias ​​verwenden können oder möchten, können Sie eine Funktion verwenden, um die Aufgabe zu erledigen:

git() {
  if [ "$1" = commit ]; then
    shift
    set -- commit -v "$@"
  fi
  command git "$@"
}
Stéphane Chazelas
quelle
3
Beachten Sie, dass das Zulassen von Aliasnamen mit Leerzeichen oder anderen Sonderzeichen eine csh-Funktion ist, die in Bourne-Shells (die zsh auf seltsame Weise emuliert) nicht vorhanden ist. Shells im Borowski-Stil deaktivieren die Alias-Erweiterung, wenn das erste Wort in Anführungszeichen gesetzt wird (siehe Renans Antwort) .
Gilles 'SO- hör auf böse zu sein'
Ja. Deshalb habe ich gesagt, dass es nur in csh, tcsh und zsh funktioniert, die diesen Fehler nicht haben. Beachten Sie, dass die Bourne-Shell keine Aliase unterstützt. Aliase wurden von csh eingeführt.
Stéphane Chazelas
9

In Bash können Sie keinen Alias ​​für einen Befehl mit Leerzeichen erstellen.
Ich verwende jedoch die folgende Funktion in meinem .bashrc als Problemumgehung.

sudo() { if [[ $@ == "pacman -Syu" ]]; then command pacup.sh; else command sudo "$@"; fi; }

So funktioniert es: Sie beginnen mit dem Befehl, den Sie aufrufen möchten. In meinem Fall ist es das sudo.
Anschließend erwähnen Sie, welche Parameter erforderlich sind. In diesem Fall pacman -Syu.
Wenn ausgelöst, welchen Befehl soll er ausführen? In der obigen Aussage ist es pacup.sh.
Else, welcher Befehl ausgeführt werden soll, sudo $@. $@Dies ist, wie Sie anhand der erraten haben, die Parameterliste, die der Befehl annimmt.

Wenn Sie den Befehl für Ihren speziellen Fall eingeben, ist dies:

git() { if [[ $1 == "commit" ]]; then command git commit -v; else command git "$@"; fi; }

Diese Lösung ist jedoch für den allgemeineren Fall gedacht, in dem Sie Befehle mit Leerzeichen als Alias ​​verwenden möchten.
In Ihrem speziellen Fall würde ich Ihnen empfehlen, die Lösung von jw013 zu verwenden, um Aliasnamen für Ihre git-Befehle zu verwendengit-config

verdammt
quelle
Meinst du nicht if [[ $1 == 'commit' ]]...? Die Erweiterung von $ @ kann mehr Argumente für das Festschreiben enthalten, die Sie tatsächlich behalten möchten.
Kojiro
Recht! Meine schlechte .. Ich habe einfach die Aussage geändert, die ich für mein System verwendet habe.
Darnir
Das ist großartig - danke - es ist perfekt für das, was ich brauchte;
Cgseller
4

Aus der Bash-Alias-Manpage

Das erste Wort jedes einfachen Befehls wird, wenn es nicht in Anführungszeichen gesetzt ist, überprüft, um festzustellen, ob es einen Alias ​​hat. In diesem Fall wird dieses Wort durch den Text des Alias ​​ersetzt. Der Aliasname und der Ersetzungstext können alle gültigen Shell-Eingaben enthalten, einschließlich Shell-Metazeichen, mit der Ausnahme, dass der Aliasname möglicherweise kein "=" enthält.

Das erste Wort des Ersetzungstextes wird auf Aliase geprüft, ein Wort, das mit einem zu erweiternden Alias ​​identisch ist, wird jedoch nicht ein zweites Mal erweitert. Dies bedeutet, dass beispielsweise ein Alias ​​"ls" für "ls -F" verwendet werden kann und Bash nicht versucht, den Ersetzungstext rekursiv zu erweitern.

Da nur das erste Wort markiert ist, können Sie keinen Alias ​​mit mehreren Wörtern erstellen. In dieser Frage Super User , eine Abhilfe eine Funktion vorgesehen ist:

ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }

Es kann angepasst werden git.

Renan
quelle
Dieser Link, den Sie angeben, unterscheidet sich von der Bash-Dokumentation, die ich habe, und scheint im Widerspruch zum Bash-Verhalten zu stehen. Oben steht, dass beispielsweise Leerzeichen in Aliasnamen zulässig sind. Es sieht für mich eher nach zsh-Verhalten aus, auch wenn auf dieser Seite ausdrücklich bash steht.
Stéphane Chazelas
2
@sch Bourne / POSIX-Shells umgehen die Alias-Erweiterung, wenn ein Wort in Anführungszeichen gesetzt wird. Zum Beispiel \lsumgeht ein Alias ​​für ls.
Gilles 'SO - hör auf böse zu sein'
1
@ Gilles. Die Bourne-Shell implementiert keine Aliase. POSIX sagt, dass ein nicht zitiertes Wort, das mit einem gültigen Aliasnamen übereinstimmt (wobei es sich nur um ASCII alnum + handelt [_!%,@]), erweitert werden soll. Erweiterungen wie zshs Aliasing von '\ ls' oder ksh / dash / bash / zshs Aliasing von werden nicht verboten, a-bda sonst keine einzige POSIX-Shell existieren würde. Es heißt nur, dass ein portables Skript (keine Shell) keinen solchen Alias ​​verwenden sollte.
Stéphane Chazelas
2
Mit @sch POSIX können Implementierungen andere Zeichen in Aliasen verwenden, aber das Zitieren eines beliebigen Teils des Wortes verhindert die Aliaserweiterung . Wenn Sie 'git commit'in einer POSIX-Shell an der Position eines Befehls schreiben , muss ein eingebautes Dienstprogramm, eine Funktion oder ein externer Befehl aufgerufen werden.
Gilles 'SO- hör auf böse zu sein'
0

Auch wenn die richtige Lösung darin besteht, Aliase wie in jw013 vorgeschlagen zu verwenden, können Sie NEST-Aliase verwenden, um einen Alias ​​mit Leerzeichen zu erstellen.

Zum Beispiel habe ich einen Alias ​​zum Löschen eines Zweigs sowohl lokal als auch remote, aber ich möchte, dass der Benutzer den Zweig immer angibt:

remrem = "!sh -c 'if [ $# -ne 1 ]; then git specBranch; else git push origin :$1 && git branch -d $1; fi' -"

#echoing aliases
specBranch = "!sh -c 'echo Specify branch please!'" 
Empus
quelle
-1

Aus diesem Beispiel sollte diese Arbeit:

Wenn Sie also sudo weiterhin mit anderen Befehlen, aber nicht mit shutdown verwenden möchten und es sich leisten können, einen Alias ​​für shutdown für etwas anderes zu erstellen, haben Sie folgende Möglichkeiten:

alias sudo='sudo '
alias shutdown="echo nope"

Aber mit deinen Befehlen:

alias git='git '
alias commit="commit -v"
Pureferret
quelle