2010-08-21 4 views
34

meine ~/.gitconfig ist:Ist es möglich, Git-Befehl durch Git Alias ​​zu überschreiben?

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

Allerdings, wenn ich git commit eingeben, wird Skript nicht genannt.

Ist es möglich, oder muss ich einen anderen Aliasnamen verwenden?

+2

Die Antwort von Mathepic ist vollständig korrekt. Natürlich denke ich, es ist ein strittiger Punkt. Solange Sie Aliasing sind, warum verkürzen Sie den Befehl nicht? Alias ​​'co' zu'! Sh checkout.sh', also musst du nicht alles austippen (oder sogar tab-complete). – Cascabel

+0

Das ist bedauerlich. Auch ich hätte mir gewünscht, dass diese Funktion das Standardverhalten von "git log" mit einem Online-Format überschreibt. Ich weiß, dass Sie andere Aliase verwenden können, aber so lange wie der Standard existiert, Gewohnheit macht Sie es verwenden und lernen Sie nie Ihren Ersatzbefehl :( –

Antwort

34

Es ist nicht möglich

Das von meinem Klon von git.git ist:

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; 
} 

So ist es nicht möglich. (handle_internal_command ruft 10 auf, wenn es den Befehl findet).

Sie könnten dies in Ihren Quellen beheben, indem Sie die Reihenfolge der Zeilen ändern und handle_alias aufrufen, wenn es den Alias ​​findet.

+12

git config sollte wahrscheinlich eine Art Warnung ausgeben, wenn Sie versuchen, einen Alias ​​zu erstellen, der identisch ist ein interner/externer Befehl ... Ironischerweise kann ich nicht herausfinden, wo ich Probleme für git-scm selbst melden sollte. Die Google- und Stack-Overflow-Ergebnisse scheinen durch Tools zur Verwaltung von Problemen mit Git getrübt zu sein. –

+1

@Daniel the git mailing list – alternative

+0

Dies erfordert eine Änderung des Quellcodes von git. Ich kann stattdessen 'libexec/git-core/git-commit' durch meine eigene Version ersetzen. – linquize

14

Wie bereits erwähnt, ist es nicht möglich, einen Git-Alias ​​zu verwenden, um einen Git-Befehl zu überschreiben. Es ist jedoch möglich, einen Git-Befehl mit einem Shell-Alias ​​zu überschreiben. Schreiben Sie für jede POSIXy-Shell (d. H. Nicht MS cmd) ein einfaches ausführbares Skript, das das gewünschte geänderte Verhalten ausführt und einen Shell-Alias ​​festlegt. In meinem .bashrc (Linux) und .bash_profile (Mac) Ich habe

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

In meinem ~/bin Ordner habe ich einen ausführbaren Perl-Skript namens my-git, dass, wenn das erste Argument clone ist (das heißt, der git-Befehl) überprüft. Es sieht im Wesentlichen so aus:

Meine ist ein wenig konfigurierbarer, aber Sie bekommen die Idee.

+2

Dies sollte wahrscheinlich die akzeptierte Antwort sein. Das Ersetzen von 'git' durch eine gehackte Version ist kein eine brauchbare Lösung für viele Benutzer – tripleee

+0

Als eine Alternative zum Alias ​​können Sie 'git' zu Ihrem Wrapper-Skript in einem Verzeichnis früh in Ihrem' PATH' symbolisieren.Vergewissern Sie sich, dass das Skript funktioniert nicht offensichtlich selbst statt des echten 'git'. – tripleee

11

nicht nur nicht möglich, sondern auch WONTFIX in 2009 http://git.661346.n2.nabble.com/allowing-aliases-to-override-builtins-to-support-default-options-td2438491.html

Hamano replies:

Derzeit git keine Aliase erlauben builtins außer Kraft zu setzen. Ich verstehe die Gründe dafür, aber ich frage mich, ob es übermäßig ist konservativ.

Es ist nicht.

Die meisten Shells unterstützen zwingende Befehle mit Aliasnamen, und ich bin mir nicht sicher, warum git konservativer sein muss als die Schale.

Da sane Schalen Aliase nicht erweitern, wenn in einem Script verwendet, und gibt eine praktische Möglichkeit, den Alias ​​auch von der Kommandozeile zu besiegen.

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

und vergleichen:

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

Ich entschied ich dies mit einer Bash-Funktion zu lösen. Wenn ich git clone rufe, leitet es den Anruf zu git cl um, der mein Alias ​​mit einigen hinzugefügten Schaltern ist.

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

Edit: ich den Code mit command aktualisiert, wie Aron vorgeschlagen.

+2

Statt expliziten '/ usr/local/bin/git' können Sie' command git' verwenden, um die Funktionssuche zu vermeiden. Siehe 'help git' –