2010-08-21 13 views
34

mia ~/.gitconfig è:E 'possibile sovrascrivere il comando git con git alias?

[alias] 
     commit = "!sh commit.sh" 

Tuttavia, quando si digita git commit, lo script non viene chiamato.

È possibile o devo utilizzare un altro nome alias?

+2

La risposta di mathepic è completamente corretta. Certo, penso che sia una specie di punto controverso. Finché stai facendo l'aliasing, perché non accorciare il comando? Alias ​​'co' to'! Sh checkout.sh', quindi non devi digitare tutto (o anche tab-completarlo). – Cascabel

+0

Questo è sfortunato. Anche a me sarebbe piaciuta questa funzione per sovrascrivere il comportamento predefinito di "git log" con un formato oneline. So che puoi usare altri alias ma finché esiste quello predefinito, l'abitudine ti fa usare e non impara mai il tuo comando sostitutivo :( –

risposta

34

non è possibile

Questo è dal mio clone di git.git:

static int run_argv(int *argcp, const char ***argv) 
{ 
    int done_alias = 0; 

    while (1) { 
     /* See if it's an internal command */ 
     handle_internal_command(*argcp, *argv); 

     /* .. then try the external ones */ 
     execv_dashed_external(*argv); 

     /* It could be an alias -- this works around the insanity 
     * of overriding "git log" with "git show" by having 
     * alias.log = show 
     */ 
     if (done_alias || !handle_alias(argcp, argv)) 
      break; 
     done_alias = 1; 
    } 

    return done_alias; 
} 

Quindi non la sua possibile. (chiama exit se trova il comando).

È possibile risolvere questo problema nelle origini modificando l'ordine delle linee e rendendo exit la chiamata exit se trova l'alias.

+12

git config dovrebbe probabilmente emettere qualche tipo di avvertimento se provi a creare un alias identico a un comando interno/esterno ... Ironicamente, non riesco a trovare dove segnalare problemi per git-scm. I risultati di Google e Stack Overflow sembrano essere annebbiati dagli strumenti per la gestione dei problemi CON Git. –

+1

@Daniel il mailing git list – alternative

+0

Ciò richiede la modifica del codice sorgente git. Posso invece sostituire 'libexec/git-core/git-commit' con la mia versione personalizzata – linquize

14

Come già accennato, non è possibile utilizzare un alias git per sovrascrivere un comando git. Tuttavia, è possibile sovrascrivere un comando git usando un alias di shell. Per qualsiasi shell POSIXy (ad esempio, non MS cmd), scrivi un semplice script eseguibile che esegue il comportamento modificato desiderato e imposta un alias di shell. Nel mio .bashrc (Linux) e .bash_profile (Mac) ho

export PATH="~/bin:$PATH" 
... 
alias git='my-git' 

Nella mia cartella ~/bin Ho uno script Perl eseguibile chiamato my-git che controlla se il primo argomento (vale a dire il comando git) è clone. Sembra in sostanza, in questo modo:

#!/usr/bin/env perl 
use strict; 
use warnings; 
my $path_to_git = '/usr/local/bin/git'; 
exit(system($path_to_git, @ARGV)) 
    if @ARGV < 2 or $ARGV[0] ne 'clone'; 
# Override git-clone here... 

Il mio è un po 'più configurabile, ma si ottiene l'idea.

+2

Questa dovrebbe essere la risposta accettata. Sostituire' git' con una versione compromessa non è un soluzione valida per molti utenti – tripleee

+0

In alternativa all'alias, puoi simulare 'git' con lo script del wrapper in una directory all'inizio del tuo' PATH'. Assicurati che lo script non eseguire se stesso invece del vero 'git', ovviamente. – tripleee

11

Non solo non è possibile, ma anche WONTFIX nel 2009 http://git.661346.n2.nabble.com/allowing-aliases-to-override-builtins-to-support-default-options-td2438491.html

Hamano replies:

Attualmente git non consente alias per ignorare i comandi incorporati. I capisco il ragionamento che sta dietro a questo, ma mi chiedo se è eccessivamente prudente .

Non lo è.

maggior parte delle shell supportano ignorando i comandi con gli alias, e non sono sicuro perché git ha bisogno di essere più prudenti della shell.

Perché conchiglie sane non si espandono alias quando viene utilizzato in uno script, e dà un modo pratico per sconfiggere l'alias anche dalla riga di comando.

$ alias ls='ls -aF' 
$ echo ls >script 
$ chmod +x script 

e confrontare:

$ ./script 
$ ls 
$ /bin/ls 
9

ho optato per risolvere questo con una funzione di bash. Se chiamo git clone, reindirizzeremo la chiamata a git cl, che è il mio alias con alcune opzioni aggiunte.

function git { 
    if [[ "$1" == "clone" && "[email protected]" != *"--help"* ]]; then 
    shift 1 
    command git cl "[email protected]" 
    else 
    command git "[email protected]" 
    fi 
} 

Edit: ho aggiornato il codice con command come suggerito Aron.

+2

Invece di usare '/ usr/local/bin/git' è possibile usare' command git' per evitare la ricerca della funzione. Vedi 'help git' –

Problemi correlati