Comment puis-je créer un alias pour une commande git [action] (qui inclut des espaces)?

29

La plupart de mes alias sont de cette forme: alias p='pwd'

Je veux alias git commitpour qu'il le fassegit commit -v

Mais essayer de créer un alias avec un espace donne une erreur:

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

Réponses:

31

Pas une réponse directe à votre question (puisque les alias ne peuvent être qu’un seul mot), mais vous devriez plutôt utiliser git-config:

git config --global alias.civ commit -v

Cela crée un alias git pour que git civs'exécute git commit -v. Malheureusement, AFAIK il n'y a aucun moyen de remplacer les commandes git existantes par des alias . Cependant, vous pouvez toujours choisir un nom d'alias approprié pour vivre avec comme alternative.

jw013
la source
Voir la note ajoutée pour répondre à propos de git confignongit-config
Michael Durrant
Comme cette réponse au fil que vous avez lié le montre clairement, il est possible de remplacer les gitcommandes existantes par des alias, avec juste un peu de script shell. (Je ne poste pas ce commentaire comme une critique, BTW. Cette réponse a été publiée près d'un an après la vôtre! Je la publie simplement dans l'espoir que les gens pourraient la trouver utile.)
sampablokuper
17

Vous parlez d'une commande qui comprend un espace, mais ici la commande est gitet il n'y a pas d'espace là-dedans.

Pour appeler une commande git commit , vous devez l'écrire

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

Généralement, les commandes n'ont pas d'espace dans leurs noms pour cette raison qu'il est fastidieux de les appeler dans un shell, donc je ne pense pas que vous trouverez une telle commande sur votre système.

csh, tcsh ou zsh vous permettra d'alias l'un de ceux ci-dessus, mais pas bash ou ksh (bien que pdksh vous le permette mais vous ne vous autoriserez pas à les utiliser). En zsh:

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

Fera de la git commandcommande (lorsqu'elle est appelée en tant que 'git command'(avec les guillemets simples)) un alias pour la gitcommande avec les arguments commitet -v. Ce n'est pas ce que vous cherchiez, je suppose.

Étant donné que aliasvous ne pouvez créer que des commandes d' alias , tout ce que vous pouvez alias ici est la gitcommande, et vous devez l'aliaser à quelque chose qui insère un "-v" après "commit" dans sa liste d'arguments. Le mieux serait d'aller avec la solution de @ jw013 mais si pour une raison quelconque vous ne pouvez pas ou ne voudriez pas, au lieu d'utiliser un alias, vous pouvez utiliser une fonction pour faire le travail:

git() {
  if [ "$1" = commit ]; then
    shift
    set -- commit -v "$@"
  fi
  command git "$@"
}
Stéphane Chazelas
la source
3
Notez que permettre des alias avec des espaces ou d'autres caractères spéciaux est une fonctionnalité csh non présente dans les shells de style Bourne (que zsh émule d'une manière étrange). Les shells de style Bourne désactivent l'expansion d'alias lorsque le premier mot est cité de quelque façon que ce soit, voir la réponse de Renan .
Gilles 'SO- arrête d'être méchant'
Oui. C'est pourquoi j'ai dit que cela ne fonctionnait que dans csh, tcsh et zsh qui n'ont pas ce bogue. Notez que le shell Bourne ne prend pas en charge les alias. Les alias ont été introduits par csh.
Stéphane Chazelas
9

Dans Bash, vous ne pouvez pas créer d'alias pour une commande contenant des espaces.
Cependant, j'utilise la fonction suivante dans mon .bashrc comme solution de contournement.

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

Voici comment cela fonctionne: vous commencez par la commande que vous souhaitez appeler. Dans mon cas, ça l'est sudo.
Ensuite, vous mentionnez quels paramètres cela prendrait. Dans ce cas pacman -Syu,.
Si, déclenché, quelle commande doit-il exécuter? Dans la déclaration ci-dessus, il estpacup.sh .
Sinon, quelle commande doit être exécutée, sudo $@. $@est, comme vous l'aurez deviné, la liste des paramètres de la commande.

Donc, en faisant la commande pour votre cas particulier, ce serait:

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

Cependant, cette solution est pour le cas plus général où vous souhaitez alias des commandes avec des espaces en eux.
Dans votre cas spécifique, je vous recommande d'utiliser la solution de jw013 pour alias vos commandes git en utilisantgit-config

darnir
la source
Tu ne veux pas dire if [[ $1 == 'commit' ]]...? L'expansion de $ @ peut avoir plus d'arguments pour la validation que vous souhaitez réellement conserver.
kojiro
Droite! Mon mauvais .. J'ai simplement changé la déclaration que j'utilisais pour mon système.
darnir
C'est génial - merci - c'est parfait pour ce dont j'avais besoin;
cgseller
4

Depuis la page de manuel bash alias

Le premier mot de chaque commande simple, s'il n'est pas cité, est vérifié pour voir s'il a un alias. Si c'est le cas, ce mot est remplacé par le texte de l'alias. Le nom d'alias et le texte de remplacement peuvent contenir n'importe quelle entrée de shell valide, y compris des métacaractères de shell, à l'exception que le nom d'alias ne peut pas contenir `= '.

Le premier mot du texte de remplacement est testé pour les alias, mais un mot identique à un alias en cours de développement n'est pas développé une deuxième fois. Cela signifie que l'on peut alias ls à "ls -F", par exemple, et Bash n'essaie pas de développer récursivement le texte de remplacement.

Donc, comme seul le premier mot est vérifié, vous ne pouvez pas avoir d'alias avec plusieurs mots. Dans cette question de super utilisateur , une solution de contournement utilisant une fonction est fournie:

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

Il peut être adapté à git.

Renan
la source
Ce lien que vous donnez est différent de la documentation bash que j'ai et semble être en contradiction avec le comportement bash. Il est dit ci-dessus que les espaces par exemple sont autorisés dans les noms d'alias. Cela ressemble plus à un comportement zsh pour moi même si cette page dit explicitement bash.
Stéphane Chazelas
2
Les shells @sch Bourne / POSIX contournent l'expansion d'alias si un mot est cité de quelque façon que ce soit. Par exemple, \lscontourne un alias pour ls.
Gilles 'SO- arrête d'être méchant'
1
@Gilles. Le shell Bourne n'implémente pas d'alias. POSIX indique qu'un mot sans guillemets correspondant à un nom d'alias valide (n'étant que ASCII alnum + [_!%,@]) doit être développé. Cela n'interdit pas les extensions comme l'aliasing de zsh de '\ ls', ou l'aliasing de ksh / dash / bash / zsh a-bsinon il n'existerait pas de shell POSIX unique. Il dit simplement qu'un script portable (pas un shell) ne devrait pas utiliser un tel alias.
Stéphane Chazelas
2
@sch POSIX permet aux implémentations d'utiliser d'autres caractères dans les alias, mais le fait de citer n'importe quelle partie du mot empêche l'expansion des alias . Si vous écrivez 'git commit'en position de commande dans un shell POSIX, il doit appeler un utilitaire intégré, une fonction ou une commande externe.
Gilles 'SO- arrête d'être méchant'
0

Même si la bonne solution consiste à utiliser des alias comme jw013 suggéré, pour créer des alias avec des espaces, vous pouvez imbriquer des alias.

Par exemple, j'ai un alias pour supprimer la branche localement et à distance, mais je voudrais que l'utilisateur spécifie toujours la branche:

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
la source
-1

Dans cet exemple, cela devrait fonctionner:

Donc, si vous voulez toujours utiliser sudo avec d'autres commandes mais pas avec shutdown et si vous pouvez vous permettre d'alias shutdown vers autre chose, vous pouvez avoir:

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

Mais avec vos commandes:

alias git='git '
alias commit="commit -v"
Pureferret
la source