77 votes

Comment intégrer des scripts bash directement à l'intérieur d'un alias git

Puis-je incorporer le suivant shell bash code:

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 a conduit de ma question précédente , et où j'ai mis le code dans un .sh fichier, puis un alias dans le fichier:

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

Mais dans la quête sans fin pour des raisons de simplicité, il doit bien y avoir un moyen d'ignorer le fichier et insérez le code directement dans l'alias? Je ne peux pas comprendre le format...

91voto

u0b34a0f6ae Points 14874
git config --global alias.diffall '!sh diffall.sh'

C'est redondante dans un seul sens. Si vous allez à ajouter "diffall.sh" dans votre $PATH de toute façon, pourquoi ne pas l'enregistrer en tant que 'git-diffall', et sauvez-vous de déclarer un alias. Oui, "git diffall" va l'exécuter.

33voto

michael_n Points 980

Pour exécuter des commandes à l'intérieur d'un alias git, et en particulier pour passer des arguments à ces commandes, vous aurez probablement à créer un temporaire de la fonction qui permet ensuite de faire valoir 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 qui est également plus souple que ce que vous pouvez faire dans une simple "déclaration"); et vous pouvez sans doute dire que, pour les deux options, les autres arguments de la commande git sont simplement passés comme arguments pour l'alias, peu importe si c'est "echo" ou "f"; l'invocation de la fonction simplement consomme le args, ignorant ce qui n'est pas explicitement utilisé:

$ git foo a b c
begin arg=a/b/end a b c

$ git foo2 a b c
begin arg=a/b/end

Autre exemple, les listes de tous les alias, basée sur la correspondance de motif) (remarque: vous pouvez réutiliser le même nom de fonction "f()" tout au long de l' .gitconfig):

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

La première renvoie le nom d'alias de juste "foo$", le deuxième "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 de la coque; je suis en utilisant ce avec bash sous Linux, Unix et Cygwin (Windows).)

24voto

albfan Points 2333

Je ne pouvais pas trouver dans la documentation, mais si vous créez un script "git-<nom>" dans le chemin d'accès, vous pouvez l'appeler avec "git nom" dans votre pension.

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

Donc, vous pouvez écrire n'importe quel alias que vous aimez avec cette (assez obscures) trop.

13voto

David Claridge Points 2266

L'ajout de ces 2 ligne pour votre .git/config fichier devrait faire l'affaire.

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

Edit: sans doute le git-config version fonctionne aussi, mais je tiens à garder mon alias dans le fichier de configuration pour faciliter la gestion.

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

-4voto

Denian Points 346

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

Avez-vous essayé d'ajouter un script dans .git/hooks?

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

#!/bin/bash

echo "This is run after a 'git checkout'"

et puis exécutez la commande:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X