Cómo incrustar el script bash directamente dentro de un alias git

¿Puedo insert el siguiente código de shell bash:

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

directamente en la creación de un git alias:

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

Esto me lleva desde mi pregunta / respuesta anterior en SO, donde puse el código en un file .sh y luego alias al file:

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

Pero en la búsqueda interminable de simplicidad, debe haber una manera de omitir el file e insert el código directamente en el alias. No puedo entender el formatting …

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

Esto es networkingundante de una manera. Si va a agregar 'diffall.sh' en su $ PATH de todos modos, ¿por qué no savelo como 'git-diffall' y evitar la statement de un alias? Sí, "git diffall" lo ejecutará.

Para ejecutar commands dentro de un git alias, y en particular para pasar arguments a esos commands, es probable que tengas que crear una function temporal que luego invocarás inmediatamente:

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

En este ejemplo, la function es probablemente lo que necesita (y también es más flexible en cuanto a lo que puede hacer en una sola "statement"); y probablemente puedas decir que para ambas opciones, las args restantes del command git simplemente se pasan como args al alias, independientemente de si es "echo" o "f"; invocar la function simplemente consume los arguments, ignorando lo que no se usa explícitamente:

 $ git foo abc begin arg=a/b/end abc $ git foo2 abc begin arg=a/b/end 

Otro ejemplo (enumera todos los alias, según el patrón de coincidencia) (nota: puede seguir reutilizando el mismo nombre de function "f ()" en el .gitconfig):

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

El primero devuelve el alias para solo "foo $", el 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 

(nb: los resultados reales pueden variar según el shell; estoy usando esto con bash en Linux, Unix y Cygwin (Windows).)

No pude encontrar en la documentation, pero si creas un script "git- <nombre>" en la ruta, puedes llamarlo con "git name" en tu repository.

Ver:

 $ 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 <my@Laptop.(none)> | Date: Fri Apr 1 16:47:20 2011 +0200 | | would have been better not to do it at all | ... $ 

Por lo tanto, puedes escribir cualquier alias que desees con esta manera (bastante oscura) también.

Aún más, puede agregar autocompletado a ese nuevo command que define una function. Información aquí

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

Agregar estas 2 líneas a su file .git / config debería hacer el truco.

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

Editar: presumiblemente, la versión de git-config también funciona, pero me gusta mantener mis alias en el file de configuration para facilitar la administración.

Hay una buena página en la wiki de git que explica alias muy claramente: http://git.or.cz/gitwiki/Aliases En particular, lea 'alias avanzados con arguments'

(De la documentation de ProGit: http://progit.org/book/ch7-3.html )

¿Has intentado agregar un script en .git / hooks?

Por ejemplo, si crea un script .git / hooks / post-checkout:

 #!/bin/bash echo "This is run after a 'git checkout'" 

y luego ejecuta el command:

 $ git checkout master Switched to branch 'master' This is run after a 'git checkout'