¿Cómo puedo crear un alias para un comando git [acción] (que incluye espacios)?

29

La mayoría de mis alias son de esta forma: alias p='pwd'

Quiero alias git commitpara que lo hagagit commit -v

Pero intentar crear un alias con un espacio da un error:

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

Respuestas:

31

No es una respuesta directa a su pregunta (ya que los alias solo pueden ser una palabra), pero debería usar en su git-configlugar:

git config --global alias.civ commit -v

Esto crea un alias git para que se git civejecute git commit -v. Desafortunadamente, AFAIK no hay forma de anular los comandos git existentes con alias . Sin embargo, siempre puede elegir un nombre de alias adecuado para vivir como alternativa.

jw013
fuente
Ver nota agregada para responder sobre git confignogit-config
Michael Durrant
Como esta respuesta al hilo que vinculó deja en claro, es posible anular los gitcomandos existentes con alias, con solo un poco de script de shell. (.! No estoy publicar este comentario como una crítica, por cierto Esa respuesta fue publicada casi un año después de la suya sólo estoy publicar con la esperanza de que la gente pueda encontrar útil.)
sampablokuper
17

Estás hablando de un comando que incluye un espacio, pero aquí está el comando gity no hay espacio allí.

Para llamar a un comando git commit , deberías escribirlo

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

En general, los comandos no tienen espacio en sus nombres por esa razón por la cual es engorroso llamarlos en un shell, por lo que no creo que encuentres dicho comando en tu sistema.

csh, tcsh o zsh le permitirán alias cualquiera de los anteriores, pero no bash o ksh (aunque pdksh le permitirá pero no le permitirá usarlos). En zsh:

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

Hará que el git commandcomando (cuando se llame como 'git command'(solo con comillas simples)) sea un alias para el gitcomando con los argumentos commity -v. Aunque no es lo que estabas buscando, supongo.

Debido a aliasque solo puede alias de comandos , todo lo que puede alias aquí es el gitcomando, y necesitaría alias a algo que inserte un "-v" después de "commit" en su lista de argumentos. Lo mejor sería ir con la solución de @ jw013, pero si por alguna razón no puedes o no quieres, en lugar de usar un alias, puedes usar una función para hacer el trabajo:

git() {
  if [ "$1" = commit ]; then
    shift
    set -- commit -v "$@"
  fi
  command git "$@"
}
Stéphane Chazelas
fuente
3
Tenga en cuenta que permitir alias con espacios u otros caracteres especiales es una función csh que no está presente en los shells de estilo Bourne (que zsh emula de una manera extraña). Los shells de estilo Bourne deshabilitan la expansión de alias cuando la primera palabra se cita de alguna manera, vea la respuesta de Renan .
Gilles 'SO- deja de ser malvado'
Sí. Es por eso que dije que solo funcionaba en csh, tcsh y zsh que no tienen ese error. Tenga en cuenta que el shell Bourne no admite alias. Los alias fueron introducidos por csh.
Stéphane Chazelas
9

En Bash no puede crear un alias para un comando con ningún espacio en blanco.
Sin embargo, uso la siguiente función en mi .bashrc como solución alternativa.

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

Cómo funciona esto: comienza con el comando al que desea llamar. En mi caso lo es sudo.
Luego, mencionas qué parámetros tomaría. En este caso pacman -Syu,.
Si, activado, ¿qué comando debe ejecutar? En la declaración anterior es pacup.sh.
Si no, lo que es comando a ser ejecutado, sudo $@. $@es, como habrás adivinado por, la lista de parámetros que toma el comando.

Entonces, al hacer el comando para su caso particular, sería:

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

Sin embargo, esta solución es para el caso más general de cuando desea alias de comandos con espacios en blanco en ellos.
En su caso específico, le recomendaría que vaya con la solución de jw013 para alias sus comandos git usandogit-config

darnir
fuente
No quiere decir if [[ $1 == 'commit' ]]...? La expansión de $ @ puede tener más argumentos para el compromiso que realmente desea mantener.
kojiro
¡Correcto! Lo malo ... simplemente cambié la declaración que estaba usando para mi sistema.
darnir el
Esto es increíble, gracias, es perfecto para lo que necesitaba;
cgseller
4

Desde la página de manual de bash alias

La primera palabra de cada comando simple, si no se cita, se verifica para ver si tiene un alias. Si es así, esa palabra se reemplaza por el texto del alias. El nombre de alias y el texto de reemplazo pueden contener cualquier entrada de shell válida, incluidos los metacaracteres de shell, con la excepción de que el nombre de alias no puede contener `= '.

La primera palabra del texto de reemplazo se prueba en busca de alias, pero una palabra que es idéntica a un alias que se expande no se expande por segunda vez. Esto significa que uno puede alias ls a "ls -F", por ejemplo, y Bash no intenta expandir recursivamente el texto de reemplazo.

Entonces, como solo se marca la primera palabra, no puede tener un alias con varias palabras. En esta pregunta de Superusuario, se proporciona una solución alternativa usando una función:

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

Se puede adaptar a git.

Renan
fuente
Ese enlace que da es diferente de la documentación de bash que tengo y parece estar en contradicción con el comportamiento de bash. Dice anteriormente que los espacios, por ejemplo, están permitidos en los nombres de alias. Me parece más un comportamiento zsh incluso si esa página dice explícitamente bash.
Stéphane Chazelas
2
Los shells @sch Bourne / POSIX omiten la expansión de alias si se cita una palabra de alguna manera. Por ejemplo, \lsomite un alias para ls.
Gilles 'SO- deja de ser malvado'
1
@Gilles. El shell Bourne no implementa alias. POSIX dice [_!%,@]que se expandirá una palabra sin comillas que coincida con un nombre de alias válido (que es solo ASCII alnum + ). No prohíbe extensiones como el alias de zsh de '\ ls', o el alias de ksh / dash / bash / zsh de lo a-bcontrario no existiría un único shell POSIX. Simplemente dice que un script portátil (no shell) no debería usar ningún alias.
Stéphane Chazelas
2
@sch POSIX permite que las implementaciones utilicen otros caracteres en alias, pero citar cualquier parte de la palabra inhibe la expansión de alias . Si escribe 'git commit'en la posición del comando en un shell POSIX, debe invocar una utilidad incorporada, una función o un comando externo.
Gilles 'SO- deja de ser malvado'
0

Aunque la solución correcta es usar alias como se sugiere jw013, para crear alias con espacios puede NESAR alias.

Por ejemplo, tengo un alias para eliminar la rama, tanto local como remotamente, pero me gustaría que el usuario especifique la rama siempre:

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
fuente
-1

A partir de este ejemplo, esto debería funcionar:

Entonces, si todavía desea usar sudo con otros comandos pero no con el apagado y si puede permitirse el lujo de cerrar el alias a otra cosa, puede tener:

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

Pero con tus comandos:

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