Comment intégrer un script bash directement dans un alias git

Puis-je intégrer le code shell bash suivant:

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

directement dans la création d’un alias git:

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

Cela m’amène à ma question / réponse précédente sur SO, où je mets le code dans un fichier .sh, puis crée un alias du fichier:

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

Mais dans la quête sans fin de la simplicité, il doit y avoir un moyen de sauter le fichier et d’insérer du code directement dans l’alias? Je n’arrive pas à comprendre le format …

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

C’est redondant dans un sens. Si vous voulez append “diffall.sh” dans votre $ PATH, pourquoi ne pas l’enregistrer en tant que “git-diffall” et éviter de déclarer un alias. Oui, “git diffall” l’exécutera.

Pour exécuter des commandes à l’intérieur d’un alias git, et en particulier pour transmettre des arguments à ces commandes, vous devrez probablement créer une fonction temporaire que vous appelez immédiatement:

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

Dans cet exemple, la fonction est probablement ce dont vous avez besoin (et est également plus flexible quant à ce que vous pouvez faire dans une seule “déclaration”); et vous pouvez probablement dire que pour les deux options, les arguments restants de la commande git sont simplement transmis sous forme d’arguments à l’alias, que ce soit “echo” ou “f”; invoquer la fonction consum simplement les arguments, en ignorant ce qui n’est pas explicitement utilisé:

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

Un autre exemple (liste tous les alias, en fonction du motif correspondant) (note: vous pouvez continuer à réutiliser le même nom de fonction “f ()” dans le fichier .gitconfig):

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

Le premier renvoie l’alias pour juste “foo $”, le second pour “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: les résultats réels peuvent varier en fonction du shell; je l’utilise avec bash sur Linux, Unix et Cygwin (Windows).)

Je n’ai pas pu trouver dans la documentation, mais si vous créez un script “git- ” dans le chemin, vous pouvez l’appeler avec “git name” dans votre repo.

Voir:

 $ 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 | ... $ 

Ainsi, vous pouvez écrire tout alias que vous aimez avec cette méthode (plutôt obscure).

Encore plus, vous pouvez append l’auto-complétion à cette nouvelle commande définissant une fonction. Info ici

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

Ajouter ces 2 lignes à votre fichier .git / config devrait faire l’affaire.

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

Edit: sans doute la version de git-config fonctionne aussi, mais j’aime garder mes alias dans le fichier de configuration pour faciliter la gestion.

Il y a une belle page sur le wiki git qui explique très clairement les alias: http://git.or.cz/gitwiki/Aliases En particulier, lisez les «alias avancés avec des arguments».

(De la documentation ProGit: http://progit.org/book/ch7-3.html )

Avez-vous essayé d’append un script en .git / hooks?

Par exemple, si vous créez un script .git / hooks / post-checkout:

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

puis exécutez la commande:

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