Come posso creare un alias per un comando git [action] (che include spazi)?


29

La maggior parte dei miei alias sono di questa forma: alias p='pwd'

Voglio alias in git commitmodo che lo facciagit commit -v

Ma provare a creare un alias con uno spazio genera un errore:

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

Risposte:


31

Non una risposta diretta alla tua domanda (poiché gli alias possono essere solo una parola), ma dovresti git-configinvece utilizzare :

git config --global alias.civ commit -v

Questo crea un alias git in modo che venga git civeseguito git commit -v. Sfortunatamente, AFAIK non ha modo di sovrascrivere i comandi git esistenti con alias . Tuttavia, puoi sempre scegliere un nome alias adatto con cui convivere in alternativa.


Vedi nota aggiunta per rispondere di git confignogit-config
Michael Durrant,

Come chiarisce questa risposta al thread che hai collegato, è possibile sovrascrivere i gitcomandi esistenti con alias, con solo un po 'di script di shell. (Non sto pubblicando questo commento come critica, BTW. Quella risposta è stata pubblicata quasi un anno dopo la tua! Lo sto solo pubblicando nella speranza che la gente possa trovarlo utile.)
sampablokuper

17

Stai parlando di un comando che include uno spazio, ma qui il comando è gite non c'è spazio lì dentro.

Per chiamare un comando git commit , dovresti scriverlo

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

Generalmente i comandi non hanno spazio nei loro nomi per quel motivo che è ingombrante chiamarli in una shell, quindi non credo che troverai tale comando sul tuo sistema.

csh, tcsh o zsh ti permetteranno di creare uno di questi sopra, ma non bash o ksh (anche se pdksh ti consentirà ma non ti lascerai usare). In zsh:

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

Trasformerà il git commandcomando (quando chiamato come 'git command'(solo tra virgolette singole) un alias per il gitcomando con gli argomenti commite -v. Tuttavia, non è quello che stavi cercando.

Poiché è aliaspossibile solo comandi alias , tutto ciò che è possibile alias qui è il gitcomando e sarà necessario alias in qualcosa che inserisca un "-v" dopo "commit" nel suo elenco di argomenti. La cosa migliore sarebbe andare con la soluzione di @ jw013 ma se per qualche motivo non puoi o no, invece di usare un alias, potresti usare una funzione per fare il lavoro:

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

3
Si noti che consentire alias con spazi o altri caratteri speciali è una funzione csh non presente nelle shell in stile Bourne (che zsh emula in modo strano). Le shell in stile Bourne disabilitano l'espansione dell'alias quando la prima parola viene citata in qualche modo, vedi la risposta di Renan .
Gilles 'SO- smetti di essere malvagio' il

Sì. Ecco perché ho detto che ha funzionato solo in csh, tcsh e zsh che non hanno quel bug. Si noti che la shell Bourne non supporta gli alias. Gli alias sono stati introdotti da csh.
Stéphane Chazelas,

9

In Bash non è possibile creare un alias per un comando con spazi vuoti al suo interno.
Tuttavia, utilizzo la seguente funzione nel mio .bashrc come soluzione alternativa.

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

Come funziona: si inizia con il comando che si desidera chiamare. Nel mio caso lo è sudo.
Quindi, menzionate quali parametri sarebbero necessari. In questo caso pacman -Syu,.
Se, attivato, quale comando dovrebbe eseguire? Nella dichiarazione precedente lo è pacup.sh.
Altrimenti, quale comando deve essere eseguito, sudo $@. $@è, come avrete intuito da, l'elenco dei parametri che il comando accetta.

Quindi, eseguendo il comando per il tuo caso particolare, sarebbe:

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

Tuttavia, questa soluzione è per il caso più generale di quando si desidera alias comandi con spazi bianchi al loro interno.
Nel tuo caso specifico, ti consiglierei di andare con la soluzione di jw013 ad alias i tuoi comandi git usandogit-config


Non intendi if [[ $1 == 'commit' ]]...? L'espansione di $ @ potrebbe avere più argomenti per il commit che vuoi davvero mantenere.
Kojiro,

Destra! Mio cattivo .. Ho semplicemente cambiato la dichiarazione che stavo usando per il mio sistema.
darnir,

Questo è fantastico - grazie - è perfetto per quello di cui avevo bisogno;
cgseller

4

Dalla pagina man di bash alias

La prima parola di ogni semplice comando, se non quotata, viene controllata per vedere se ha un alias. In tal caso, tale parola è sostituita dal testo dell'alias. Il nome alias e il testo sostitutivo possono contenere qualsiasi input shell valido, inclusi i metacaratteri shell, con l'eccezione che il nome alias non può contenere `= '.

La prima parola del testo sostitutivo viene testata per gli alias, ma una parola identica a un alias in fase di espansione non viene espansa una seconda volta. Ciò significa che si può alias ls in "ls -F", per esempio, e Bash non tenta di espandere ricorsivamente il testo di sostituzione.

Pertanto, poiché è selezionata solo la prima parola, non è possibile avere un alias con più parole. In questa domanda Super User , viene fornita una soluzione alternativa che utilizza una funzione:

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

Può essere adattato a git.


Quel link che dai è diverso dalla documentazione di bash che ho e sembra essere in contraddizione con il comportamento di bash. Dice sopra che gli spazi per esempio sono ammessi nei nomi di alias. Mi sembra più un comportamento zsh anche se quella pagina dice esplicitamente bash.
Stéphane Chazelas,

2
Le shell @sch Bourne / POSIX ignorano l'espansione dell'alias se una parola viene citata in qualche modo. Ad esempio \lsignora un alias per ls.
Gilles 'SO- smetti di essere malvagio' il

1
@Gilles. La shell Bourne non implementa gli alias. POSIX afferma che una parola non quotata che corrisponde a un nome alias valido (essendo solo ASCII alnum + [_!%,@]) deve essere espansa. Non proibisce estensioni come l'aliasing di '\ ls' di zsh o l'aliasing di ksh / dash / bash / zsh a-baltrimenti non esisterebbe una singola shell POSIX. Dice solo che uno script portatile (non shell) non dovrebbe usare tale alias.
Stéphane Chazelas,

2
POSS @sch consente alle implementazioni di utilizzare altri caratteri negli alias ma la citazione di qualsiasi parte della parola inibisce l'espansione dell'alias . Se si scrive 'git commit'nella posizione di comando in una shell POSIX, è necessario richiamare un'utilità integrata, una funzione o un comando esterno.
Gilles 'SO- smetti di essere malvagio' il

0

Anche se la soluzione corretta è usare gli alias come jw013 suggerito, per creare alias con spazi puoi alias NEST.

Ad esempio, ho un alias per eliminare il ramo sia localmente che da remoto, ma vorrei che l'utente specificasse sempre il ramo:

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!'" 

-1

Da questo esempio, dovrebbe funzionare:

Quindi, se vuoi ancora usare sudo con altri comandi ma non con shutdown e se puoi permetterti di alias shutdown a qualcos'altro, puoi avere:

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

Ma con i tuoi comandi:

alias git='git '
alias commit="commit -v"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.