2009-08-20 14 views
63

puedo incrustar el siguiente código shell bash:Cómo incrustar escritura del golpe directamente dentro de un alias de git

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

directamente en la creación de un alias de git:

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

Esto nos lleva de mi previous question/answer en SO, donde pongo el código en un archivo .sh y luego un alias en el fichero:

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

Pero en el nev er-finalización de la búsqueda de la simplicidad, debe haber una forma de omitir el archivo e insertar el código directamente en el alias? No puedo entender el formato ...

Respuesta

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

Esta es redundante de una manera. Si va a agregar 'diffall.sh' en su $ PATH de todos modos, ¿por qué no guardarlo como 'git-diffall' y evitar la declaración de un alias? Sí, "git diffall" lo ejecutará.

+0

Eso. Es genial. Al principio me preocupé por ejecutar accidentalmente algo, ya que he escrito algunos guiones de shell para hacer git cosas, y les he dado el prefijo 'git-', Pero mi shell (zsh) no los autocompleta, entonces tendría que escribirlos explícitamente. Y si quiero el comportamiento de autocompletar, puedo declarar un alias git a su propio subcomando, que también es un requisito para hacer explícito el enlace del script al subcomando. –

+0

Sí, y es un binario que solo necesita la explosión: '! binario' –

13

Agregar estas 2 líneas a su archivo .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 git-config trabaja también, pero me gusta mantener mi alias en el archivo de configuración para facilitar la gestión.

Hay una buena página en la wiki de Git que explica los alias con mucha claridad: http://git.or.cz/gitwiki/Aliases En particular, leer 'alias avanzadas con argumentos'

+0

git config --global almacenará sus alias en $ HOME/.gitconfig, donde (IMO) son aún más fáciles de administrar; casi ningún alias debe ser específico del repositorio. (Repo specific go to repo/.git/config) – u0b34a0f6ae

+0

Gracias David, pero simplemente no funcionará para mí, esa o cualquiera de las variaciones en el gran enlace que incluyó. Tal vez debería haber mencionado que estoy ejecutando en el entorno de Windows? Gracias Kaizer, de acuerdo, esto es 'global' para mí. –

+0

En estos días, https://git.wiki.kernel.org/index.php/Aliases#Advanced es un buen lugar para buscar. (El enlace git o cz redirige allí, pero esta sección en particular menciona ejecutar cosas complejas con argumentos) – clacke

20

No pude encontrar en la documentación, pero si crea un script "git- < name>" en la ruta, puede llamarlo con "git name" en su repositorio.

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

Por lo tanto, se puede escribir cualquier alias que quieras con esta forma (bastante oscura) también.

Incluso más se puede añadir la terminación automática a la nueva orden de definición de una función. Información here

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

+1, pensó que solo funcionaría desde la carpeta git libexec. gracias por compartir este consejo –

-3

(De la documentación ProGit: http://progit.org/book/ch7-3.html)

¿Ha intentado añadir un guión en .git/ganchos?

Por ejemplo, si crea una secuencia de comandos.git/ganchos/post-pago y envío:

#!/bin/bash 

echo "This is run after a 'git checkout'" 

y ejecute el comando:

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

¿qué tienen que ver los ganchos con la configuración, las extensiones y los alias? –

20

para ejecutar comandos en el interior de un alias de Git, y en particular para pasar argumentos a los comandos, es probable que tiene que crear una función temporal que luego se invoca 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 función es probablemente lo que necesita (y también es más flexible en cuanto a lo que puede hacer en un solo stat" ement "); y probablemente puedas decir que para ambas opciones, las args restantes del comando git simplemente se pasan como args al alias, independientemente de si es "echo" o "f"; invocando la función simplemente consume los argumentos, haciendo caso omiso de lo que no se utiliza de forma explícita:

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

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

Otro ejemplo (enumera todos los alias, basado en la coincidencia de patrones) (nota: se puede mantener reutilizar el mismo nombre de función "f()" a lo largo la .gitconfig):

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

los primeros retornos el alias para simplemente "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 en función de la cáscara ; Estoy usando esto con bash en Linux, Unix & Cygwin (Windows).)

+0

https://git.wiki.kernel.org/index.php/Aliases#What.27s_new.3F recomienda implícitamente el uso de 'sh -c', de esa manera no tiene que preocuparse por el shell de inicio de sesión del usuario. – clacke

+0

la sintaxis de la función que he proporcionado es intencionalmente portable en bastantes shells (sh/ksh/bash/zsh), y será más rápido que iniciar un subproceso. Recomiendo seguir usando la sintaxis de la función, a menos que haya un problema de portabilidad específico en una plataforma específica. – michael

+0

Tu comentario me ha devuelto a esta respuesta, y probablemente voy a utilizar tu camino. Ahorra un nivel de oferta, y esos niveles ya son bastante locos. :-) – clacke

Cuestiones relacionadas