2012-01-12 12 views
12

Tengo el siguiente 1-liner que utilizo para ver quién podría ser un buen candidato para obtener ayuda con un pedazo de código:¿Por qué el comando running como git alias da resultados diferentes?

git log --pretty=short . | grep ^Auth | sort | uniq -c | sort -nr 

que enumera autores con el fin de confirmaciones, es crudo, pero funciona bien.

Cuando agrego a mi git config sin embargo, como esto:

[alias] 
    guru=!git log --pretty=short . | grep ^Auth | sort | uniq -c | sort -nr 

corriendo

git guru 

da resultados diferentes a ejecutarlo desde la línea de comandos.

[email protected](rp):~/git/apps$ git log --pretty=short . | grep ^Auth | sort | uniq -c | sort -nr 
710 Author: dave <[email protected]> 
415 Author: pete <[email protected]> 
402 Author: craig <[email protected]> 

En comparación con:

[email protected](rp):~/git/apps$ git guru 
859 Author: craig <[email protected]> 
813 Author: paul <[email protected]> 
798 Author: dave <[email protected]> 

Como Stefan Nawê señala a continuación, alias ejecutar en la raíz de su repositorio, ¿hay alguna manera de ejecutar el comando en el directorio en que estoy, o especificar ?

+1

Parece que usted quiere 'git shortlog -sn' por cierto. – patthoyts

+0

@patthoyts, agrégalo como respuesta y ¡funcionará! –

Respuesta

4

En cuanto a lo que está haciendo, es probable que desee utilizar git shortlog -sn ya que esto ya lo hace la tarea en cuestión.

git alias no todos funcionan en el toplevel. Como se describe en el git config manual "Tenga en cuenta que los comandos de shell se ejecutarán desde el directorio de nivel superior de un repositorio, que puede no ser necesariamente el directorio actual". Por lo tanto, solo los comandos de shell se ejecutan en el nivel superior. Si simplemente alias un subcomando git, se ejecutará en la ubicación actual. El siguiente registro de sesión demuestra esto:

[email protected] /c/src/WiRE.git/wdf/src (pt/wdf) 
$ git rev-parse --show-cdup 
../../ 

[email protected] /c/src/WiRE.git/wdf/src (pt/wdf) 
$ git config alias.cdup 'rev-parse --show-cdup' 

[email protected] /c/src/WiRE.git/wdf/src (pt/wdf) 
$ git cdup 
../../ 

[email protected] /c/src/WiRE.git/wdf/src (pt/wdf) 
$ git config alias.cdup2 '!git rev-parse --show-cdup' 

[email protected] /c/src/WiRE.git/wdf/src (pt/wdf) 
$ git cdup2 

[email protected] /c/src/WiRE.git/wdf/src (pt/wdf) 
$ 

Su ejemplo utiliza un comando de alias que comienza con 'git'. Si intento configurar 'git rev-parse --show-cdup' como el alias, devuelve un error que dice 'git no es un comando git', así que sospecho que realmente tenías un signo de exclamación y lo ejecutabas como un comando de shell, por lo tanto corriendo desde el nivel superior.

13

alias de Git mediante un comando de shell (es decir, el prefijo !) ejecutar en el nivel más alto en el directorio de trabajo (donde el .git vidas). Los alias simples (sin !) se ejecutan en el directorio actual.

+0

Gracias Stefan, esto respondió mi pregunta original, ahora estoy agradecido de poder hacerlo más útil para otros en la misma situación. –

+3

Este es un comportamiento Git bastante poco intuitivo. ¿Alguien sabe cómo ejecutar un alias en el directorio actual? ¿O si el directorio actual está disponible en un env var o algo así para que un alias pueda 'cd' regresar al lugar correcto antes de ejecutarse? –

+0

@JimStewart vea la respuesta anterior de Andrei Neculau, muestra cómo hacer exactamente eso :) – waldyrious

22

¿Hay alguna forma de ejecutar el comando en el directorio en el que estoy o especificar?

Sí, la hay. Cuando ejecutas un comando git, tu entorno obtiene una variable GIT_PREFIX con el valor de la ruta relativa (de toplevel a la ruta antes de ejecutar git) así que lo que necesitas es prefijar tus git alias (que ejecutan comandos de shell y necesitan el pwd correcto) con cd ${GIT_PREFIX:-.} &&.

Prueba simple, agregar esto a su ~/.gitconfig

[alias] p = !pwd && cd ${GIT_PREFIX:-.} && pwd

+2

Para una explicación de la sintaxis '$ {GIT_PREFIX: -.}', Consulte: http://stackoverflow.com/a/16753536/ 79111. –

Cuestiones relacionadas