Estou tentando criar um alias que usa vários comandos Git e parâmetros posicionais. Existem páginas Stackoverflow para cada uma, e parece dolorosamente óbvio fazer as duas coisas, mas estou tendo problemas.
Como exemplo, quero mudar para o ramo foo e executar um status. Então, no meu .gitconfig
, eu tenho:
[alias]
chs = !sh -c 'git checkout $0 && git status'
o que não funciona. Considerando que algo assim vai funcionar.
chs = !sh -c 'git checkout $0'
echoes = !sh -c 'echo hi && echo bye'
Qualquer insight seria apreciado.
Respostas:
Isso funcionará (testado com zsh e bash):
fonte
git chs foo
emgit checkout && git status foo
echo $1 && echo done
, quando chamado com o argumento 'foo', produzirá "foo" e "done foo".git
?!
meio principal passa a coisa toda para o shell. Caso contrário, ele assume que você está tentando executar outro comando git e o passa como argumentos para ogit
binário.;:
vez de&& :
embora. E isso também funciona bem no unix.Isso tem como alvo o Windows batch / msysgit bash; pode não funcionar em outros ambientes.
Como Olivier Verdier e Lily Ballard disseram
[alias] chs = !git checkout $1 && git status
quase funciona, mas fornece uma inserção extra espúria do argumento ...
git chs demo -> git checkout demo && git status demo
Mas se você adicionar
&& :
ao final do seu alias, o argumento falso será consumido em uma tag de localização.assim
dá a saída correta ...
git chs demo -> git checkout demo && git status
fonte
&& :
é ouro e faz com que esta solução funcione para comandos em que o argumento extra seria problemático.&& :
faz?a=123;$a
erros, masa=123; : $a
não. 2.: > hello.txt
esvazia hello.txt. 3.if [ "$a" = "hello" ];then : ;fi
roda bem, mas erros sem ':'. É comopass
em python. 4.: this is a comment
, os dois pontos seguidos por espaço funcionam como#
em uma linha de comentário.co = !git checkout public/compiled && git checkout $1
e, quando o faria, recebiagit co master
a mensagemerror: pathspec 'master' did not match any file(s) known to git.
. Não achei que essa resposta fosse útil para mim, porque a primeira coisa que menciona é o Windows e eu estou no Linux. Mas você explicou o porquê.Você pode definir uma função shell.
fonte
"
Consegui criar aliases git de várias linhas e bastante complexos. Eles funcionam bem no Windows, mas presumo que também funcionariam em outros lugares, por exemplo:
Eu escrevi um post e tenho mais alguns exemplos aqui .
fonte
!f() { : reset
para obter conclusões do comando reset github.com/git/git/blob/master/contrib/completion/…fonte
!
?!
mas, tanto quanto eu posso ver o git por padrão assumirá que o alias é um comando git, entãot = status
funcionará. No entanto, se você tentart = git status
, não funcionará (dirá o comando "git" não encontrado). Para que, onde ele!
entra, ele diz para executar o comando como se fosse um shell, e normalmente você precisa disso quando possui vários comandos git por alias, para que você possa ter,t = !git status && git log
por exemplo, e ele funcionará.Tente este:
Chame assim:
git chs master
fonte
É possível ter um alias de git de várias
\
linhas anexando ao final de cada linha.fonte
"!git fetch --prune --all; git pull --rebase upstream master; git push origin master"
meu apelido.O problema aqui é que os parâmetros posicionais parecem estar sendo enviados para o comando shell duas vezes (a partir do git 1.9.2). Para ver o que quero dizer, tente o seguinte:
Então faça
git test this is my testing string
. Você deve observar a seguinte saída (últimas duas linhas editadas aqui para maior clareza):Uma maneira de contornar isso seria:
Isso consumirá o parâmetro posicional extra à medida que for aplicado ao último comando de eco e não terá efeito nos resultados.
fonte