desenv-web-rp.com

Como incorporar o script bash diretamente em um alias do git

Posso incorporar o seguinte código Shell do bash:

for name in $(git diff --name-only $1); do git difftool $1 $name & done

diretamente na criação de um alias do git:

git config --global alias.diffall ***my-bash-code-here***

Isso leva do meu pergunta/resposta anterior no SO, onde eu coloco o código em um arquivo .sh e, em seguida, alias ao arquivo:

git config --global alias.diffall '!sh diffall.sh'

Mas na busca interminável pela simplicidade, deve haver uma maneira de pular o arquivo e inserir o código diretamente no alias? Não consigo descobrir o formato ...

77
Seba Illingworth
git config --global alias.diffall '!sh diffall.sh'

Isso é redundante de uma maneira. Se você quiser adicionar 'diffall.sh' ao seu $ PATH de qualquer maneira, por que não salvá-lo como 'git-diffall' e evite declarar um alias. Sim, o "git diffall" o executará.

90
u0b34a0f6ae

Para executar comandos dentro de um alias do git e, em particular, para passar argumentos para esses comandos, você provavelmente precisará criar uma função temporária que você chamará imediatamente:

$ vim ~/.gitconfig
...
[alias]
    # compare:
    foo = "! echo begin arg=$1/$2/end"
    foo2 = "!f() { echo "begin arg=$1/$2/end"; }; f"

Neste exemplo, a função é provavelmente o que você precisa (e também é mais flexível quanto ao que você pode fazer em uma única "instrução"); e você provavelmente pode dizer que, para ambas as opções, os argumentos restantes para o comando git são simplesmente passados ​​como argumentos para o alias, independentemente de ser "eco" ou "f"; invocar a função simplesmente consome os argumentos, ignorando o que não é explicitamente usado:

$ git foo a b c
begin arg=a/b/end a b c

$ git foo2 a b c
begin arg=a/b/end

Outro exemplo (lista todos os aliases, com base no padrão correspondente) (nota: você pode continuar reutilizando o mesmo nome da função "f ()" em todo o .gitconfig):

[alias]
    alias = "!f() { git config --get-regexp "^alias.${1}$" ; }; f"

O primeiro retorna o alias para apenas "foo $", o segundo para "foo. *":

$ git alias foo
alias.foo ! echo begin arg=$1/$2/end

$ git alias 'foo.*'
alias.foo ! echo begin arg=$1/$2/end
alias.foo2 !f() { echo begin arg=$1/$2/end; }; f

(Nota: os resultados reais podem variar com base no Shell; estou usando isso com o bash no Linux, Unix e Cygwin (Windows).)

32
michael

Não consegui encontrar na documentação, mas se você criar um script "git- <name>" no caminho, poderá chamá-lo com "git name" em seu repositório.

Vejo:

$ cd ~/bin
$ echo "echo I love this log:
>pwd
>git log --graph  --summary --decorate --all" > git-logg
$ chmod +x git-logg
$ cd /path/to/your/repo
$ git logg
I love this log:
/path/to/your/repo
* commit 3c94be44e4119228cc681fc7e11e553c4e77ad04 (whatever-branch)
| Author: myself <[email protected](none)>
| Date:   Fri Apr 1 16:47:20 2011 +0200
| 
|     would have been better not to do it at all
| 
...
$

Portanto, você também pode escrever qualquer apelido que desejar com esse modo (bastante obscuro).

Ainda mais, você pode adicionar o preenchimento automático a esse novo comando que define uma função. Informações aqui

$ _git_logg ()
{
  # you can return anything here for the autocompletion for example all the branches
  __gitcomp_nl "$(__git_refs)" 
}
24
albfan

Adicionar essas duas linhas ao seu arquivo .git/config deve fazer o truque.

[alias]
    diffall = '!for name in $(git diff --name-only $1); do git difftool $1 $name & done'

Edit: presumivelmente a versão git-config funciona também, mas eu gosto de manter meus apelidos no arquivo de configuração para facilitar o gerenciamento.

Há uma página agradável no wiki do git que explica muito claramente os aliases: http://git.or.cz/gitwiki/Aliases Em particular, leia 'aliases avançados com argumentos'

13
David Claridge