Como posso criar um alias para um comando git [action] (que inclui espaços)?

29

A maioria dos meus apelidos são desta forma: alias p='pwd'

Eu quero alias git commitpara que ele façagit commit -v

Mas tentar criar um alias com um espaço gera um erro:

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

Respostas:

31

Não é uma resposta direta à sua pergunta (já que os aliases podem ter apenas uma palavra), mas você deve usar git-config:

git config --global alias.civ commit -v

Isso cria um alias do git para que seja git civexecutado git commit -v. Infelizmente, o AFAIK não tem como substituir os comandos git existentes por aliases . No entanto, você sempre pode escolher um nome alternativo adequado para conviver como alternativa.

jw013
fonte
Veja a observação adicionada para responder sobre git confignãogit-config
Michael Durrant
Como essa resposta ao encadeamento que você vinculou deixa claro, é possível substituir os gitcomandos existentes por aliases, com apenas um pouco de script de shell. (.! Eu não estou postando este comentário como uma crítica, BTW Essa resposta foi publicado quase um ano depois de seu Eu estou apenas publicá-la na esperança de que as pessoas possam encontrá-lo útil.)
sampablokuper
17

Você está falando de um comando que inclui um espaço, mas aqui está o comando gite não há espaço lá.

Para chamar um comando git commit , você precisa escrevê-lo

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

Geralmente, os comandos não têm espaço em seus nomes por esse motivo que é complicado chamá-los em um shell, portanto, acho que você não encontrará esse comando em seu sistema.

O csh, o tcsh ou o zsh permitirá que você aliasize qualquer um dos itens acima, mas não o bash ou o ksh (embora o pdksh permita, mas você não permitirá que você os use). No zsh:

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

Tornará o git commandcomando (quando chamado apenas 'git command'(com aspas simples)) um alias para o gitcomando com os argumentos commite -v. Não é o que você estava procurando, eu acho.

Como aliassomente comandos de alias podem ser alias , tudo o que você pode alias aqui é o gitcomando, e você precisará alias para algo que insira um "-v" após "commit" em sua lista de argumentos. O melhor seria seguir a solução do @ jw013, mas se por algum motivo você não puder ou não, em vez de usar um alias, poderá usar uma função para fazer o trabalho:

git() {
  if [ "$1" = commit ]; then
    shift
    set -- commit -v "$@"
  fi
  command git "$@"
}
Stéphane Chazelas
fonte
3
Observe que permitir aliases com espaços ou outros caracteres especiais é um recurso csh que não está presente nos shells no estilo Bourne (que o zsh emula de uma maneira estranha). As conchas no estilo Bourne desativam a expansão do alias quando a primeira palavra é citada de alguma forma, veja a resposta de Renan .
Gilles 'SO- stop be evil'
Sim. É por isso que eu disse que só funcionava no csh, tcsh e zsh que não possuem esse bug. Observe que o shell Bourne não suporta aliases. Os aliases foram introduzidos pelo csh.
Stéphane Chazelas
9

No Bash, você não pode criar um alias para um comando com nenhum espaço em branco.
No entanto, eu uso a seguinte função no meu .bashrc como uma solução alternativa.

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

Como isso funciona: Você começa com o comando que deseja chamar. No meu caso é sudo.
Então, você menciona quais parâmetros seriam necessários. Nesse caso pacman -Syu,.
Se acionado, que comando ele deve executar? Na afirmação acima, é pacup.sh.
Senão, qual comando deve ser executado sudo $@,. $@é, como você deve ter adivinhado pelo, a lista de parâmetros que o comando usa.

Portanto, ao fazer o comando para o seu caso em particular, seria:

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

No entanto, esta solução é para o caso mais geral de quando você deseja aliasar comandos com espaços em branco.
No seu caso específico, eu recomendaria que você usasse a solução jw013 para alias seus comandos git usandogit-config

darnir
fonte
Você não quer dizer if [[ $1 == 'commit' ]]...? A expansão de $ @ pode ter mais argumentos para confirmar que você realmente deseja manter.
Kojiro # 23/12
Direita! Meu mal .. Eu simplesmente mudei a declaração que estava usando para o meu sistema.
darnir
Isso é incrível - obrigado - é perfeito para o que eu precisava;
cgseller
4

Na página de manual do alias do bash

A primeira palavra de cada comando simples, se não estiver entre aspas, é verificada para ver se ele possui um alias. Nesse caso, essa palavra é substituída pelo texto do alias. O nome alternativo e o texto de substituição podem conter qualquer entrada válida do shell, incluindo os metacaracteres do shell, com a exceção de que o nome alternativo não pode conter `= '.

A primeira palavra do texto de substituição é testada para aliases, mas uma palavra idêntica a um alias sendo expandido não é expandida uma segunda vez. Isso significa que se pode, por exemplo, ls a "ls -F", por exemplo, e o Bash não tenta expandir recursivamente o texto de substituição.

Portanto, como apenas a primeira palavra está marcada, você não pode ter um alias com várias palavras. Em esta questão Usuário Super , uma solução usando uma função é fornecida:

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

Pode ser adaptado para git.

Renan
fonte
Esse link que você fornece é diferente da documentação do bash que tenho e parece estar em contradição com o comportamento do bash. Diz acima que espaços, por exemplo, são permitidos em nomes alternativos. Parece-me mais com o comportamento zsh, mesmo que essa página diga explicitamente bash.
Stéphane Chazelas
2
Os shells @sch Bourne / POSIX ignoram a expansão do alias se uma palavra é citada de alguma forma. Por exemplo, \lsignora um alias para ls.
Gilles 'SO- stop be evil'
1
@Gilles. O shell Bourne não implementa aliases. O POSIX diz que uma palavra sem aspas correspondente a um nome de alias válido (sendo apenas alnum ASCII + [_!%,@]) deve ser expandida. Ele não proíbe extensões como o apelido de '\ ls' do zsh ou o apelido de ksh / dash / bash / zsh, a-bcaso contrário não existiria um único shell POSIX. Diz apenas que um script portátil (não shell) não deve usar esse apelido.
Stéphane Chazelas
2
@sch POSIX permite que implementações usem outros caracteres em pseudônimos, mas citar qualquer parte da palavra inibe a expansão do pseudônimo . Se você escrever 'git commit'na posição de comando em um shell POSIX, ele deverá chamar um utilitário interno, uma função ou um comando externo.
Gilles 'SO- stop be evil'
0

Mesmo que a solução correta seja usar aliases como jw013 sugerido, para criar alias com espaços, você pode aliases NEST.

Por exemplo, eu tenho um alias para excluir o ramo local e remotamente, mas gostaria que o usuário especifique o ramo sempre:

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

A partir deste exemplo, isso deve funcionar:

Portanto, se você ainda deseja usar o sudo com outros comandos, mas não com o shutdown, e se puder dar ao luxo de alias shutdown para outra coisa, pode ter:

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

Mas com seus comandos:

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