2012-01-12 10 views
12

Ho il seguente 1-liner che uso per vedere chi potrebbe essere un buon candidato per un aiuto con un pezzo di codice:Perché il comando di esecuzione come alias git dà risultati diversi?

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

che elenca gli autori in ordine di commit, è grezza ma funziona OK.

Quando aggiungo al mio git config tuttavia, in questo modo:

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

esecuzione

git guru 

dà risultati diversi per eseguirlo dalla riga di comando.

[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]> 

Rispetto a:

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

Come Stefan Nawe nota qui di seguito, gli alias eseguiti nella root della vostra repository, esiste un modo per eseguire il comando nella directory mi trovo, o specificare ?

+1

Sembra che si desidera 'git shortlog -sn' a proposito. – patthoyts

+0

@patthoyts, aggiungilo come risposta e otterrà un segno di spunta! –

risposta

4

Guardando a ciò che si sta facendo probabilmente si desidera utilizzare git shortlog -sn invece come questo svolge già l'attività in questione.

Alias ​​git non tutti corrono al livello superiore. Come descritto in git config manual "Si noti che i comandi della shell verranno eseguiti dalla directory di livello superiore di un repository, che potrebbe non essere necessariamente la directory corrente." Quindi solo i comandi della shell vengono eseguiti al livello più alto. Se si semplifica alias un sottocomando git, verrà eseguito nella posizione corrente. Il seguente registro di sessione lo dimostra:

[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) 
$ 

L'esempio utilizza un comando alias che inizia con 'git'. Se provo a impostare 'git rev-parse --show-cdup' come alias, restituisce un errore che dice 'git non è un comando git', quindi sospetto che tu abbia effettivamente un punto esclamativo e quindi eseguirlo come comando di shell, quindi correndo dal livello più alto.

13

alias Git mediante un comando shell (cioè prefisso !) eseguito nel livello superiore della directory di lavoro (dove le .git vite). Alias ​​semplici (senza !) vengono eseguiti nella directory corrente.

+0

Grazie Stefan, questo ha risposto alla mia domanda iniziale, ora ho sperato di renderlo più utile agli altri nella stessa situazione. –

+3

Questo è un comportamento Git abbastanza intuitivo. Qualcuno sa come eseguire un alias nella directory corrente? Oppure se la directory corrente è disponibile in un env var o qualcosa di simile in modo che un alias possa tornare alla posizione corretta prima di eseguirlo? –

+0

@JimStewart vedi la risposta di Andrei Neculau sopra, mostra come fare proprio questo :) – waldyrious

22

c'è un modo per eseguire il comando sulla directory in cui mi trovo o specificare?

Sì, c'è. Quando esegui un comando git, il tuo ambiente ottiene una variabile GIT_PREFIX con il valore del percorso relativo (dal toplevel al percorso prima dell'esecuzione di git) quindi quello che ti serve è il prefisso dei tuoi alias git (che eseguono i comandi della shell e hanno bisogno del pwd corretto) con cd ${GIT_PREFIX:-.} &&.

prova semplice, aggiungere questo al vostro ~/.gitconfig

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

+2

Per una spiegazione della sintassi '$ {GIT_PREFIX: -.}', Consultare: http://stackoverflow.com/a/16753536/ 79111. –

Problemi correlati