Come incorporare lo script di bash direttamente in un alias git

Posso incorporare il seguente codice shell bash:

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

direttamente nella creazione di un alias git:

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

Questo deriva dalla mia precedente domanda / risposta su SO, dove ho inserito il codice in un file .sh e poi aggiunto alias al file:

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

Ma nella ricerca infinita di semplicità, ci deve essere un modo per saltare il file e inserire il codice direttamente nell’alias? Non riesco a capire il formato …

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

Questo è ridondante in un modo. Se vuoi aggiungere “diffall.sh” al tuo $ PATH in ogni caso, perché non salvarlo come “git-diffall” e salvarti dal dichiarare un alias. Sì, “git diffall” lo eseguirà.

Per eseguire comandi all’interno di un alias git, e in particolare per passare argomenti a questi comandi, è probabile che tu debba creare una funzione temporanea che poi invochi immediatamente:

 $ vim ~/.gitconfig ... [alias] # compare: foo = "! echo begin arg=$1/$2/end" foo2 = "!f() { echo "begin arg=$1/$2/end"; }; f" 

In questo esempio, la funzione è probabilmente ciò di cui hai bisogno (ed è anche più flessibile su cosa puoi fare in una singola “istruzione”); e probabilmente puoi dire che per entrambe le opzioni, gli argomenti rimanenti al comando git vengono semplicemente passati come argomenti all’alias, indipendentemente dal fatto che sia “echo” o “f”; invocare la funzione semplicemente consuma gli argomenti, ignorando ciò che non è esplicitamente usato:

 $ git foo abc begin arg=a/b/end abc $ git foo2 abc begin arg=a/b/end 

Un altro esempio (elenca tutti gli alias, in base al modello di corrispondenza) (nota: è ansible continuare a riutilizzare lo stesso nome di funzione “f ()” in .gitconfig):

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

Il primo restituisce l’alias per “foo $”, il secondo per “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: i risultati effettivi possono variare in base alla shell, lo sto usando con bash su Linux, Unix e Cygwin (Windows).)

Non sono riuscito a trovare nella documentazione, ma se si crea uno script “git- ” nel percorso, è ansible chiamarlo con “nome git” nel repository.

Vedere:

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

Quindi, puoi scrivere qualsiasi alias che ti piace con questo (piuttosto oscuro) modo.

Ancora di più è ansible aggiungere il completamento automatico al nuovo comando che definisce una funzione. Info qui

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

Aggiungere queste 2 linee al tuo file .git / config dovrebbe fare il trucco.

 [alias] diffall = '!for name in $(git diff --name-only $1); do git difftool $1 $name & done' 

Modifica: presumibilmente anche la versione di git-config funziona, ma mi piace mantenere i miei alias nel file di configurazione per facilità di gestione.

C’è una bella pagina sul wiki git che spiega gli alias molto chiaramente: http://git.or.cz/gitwiki/Aliases In particolare, leggi ‘alias avanzati con argomenti’

(Dalla documentazione ProGit: http://progit.org/book/ch7-3.html )

Hai provato ad aggiungere uno script in .git / hooks?

Ad esempio, se crei uno script .git / hook / post-checkout:

 #!/bin/bash echo "This is run after a 'git checkout'" 

e quindi eseguire il comando:

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