web-dev-qa-db-fra.com

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 conduit à partir de mon question/réponse précédente sur SO, où je mets le code dans un fichier .sh puis aliasé dans le 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 d'ignorer le fichier et d'insérer du code directement dans l'alias? Je n'arrive pas à comprendre le format ...

77
Seba Illingworth
git config --global alias.diffall '!sh diffall.sh'

C'est redondant dans un sens. Si vous voulez quand même ajouter 'diffall.sh' dans votre $ PATH, pourquoi ne pas l'enregistrer en tant que 'git-diffall', et évitez de déclarer un alias. Oui, "git diffall" l'exécutera.

90
u0b34a0f6ae

Pour exécuter des commandes à l'intérieur d'un alias git, et en particulier pour passer des arguments à ces commandes, vous devrez probablement créer une fonction temporaire que vous invoquerez ensuite 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 "instruction"); et vous pouvez probablement dire que pour les deux options, les arguments restants à la commande git sont simplement passés comme arguments à l'alias, peu importe si c'est "echo" ou "f"; appeler la fonction consomme simplement les arguments, 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

Un autre exemple (répertorie tous les alias, en fonction du modèle de correspondance) (remarque: vous pouvez continuer à réutiliser le même nom de fonction "f ()" tout au long du .gitconfig):

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

Le premier retourne l'alias juste pour "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 de Shell; je l'utilise avec bash sur Linux, Unix & Cygwin (Windows).)

32
michael

Je ne pouvais pas trouver dans la documentation, mais si vous créez un script "git- <name>" dans le chemin, vous pouvez l'appeler avec "git name" dans votre dépôt.

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

Ainsi, vous pouvez également écrire n'importe quel alias que vous aimez de cette manière (plutôt obscure).

Encore plus, vous pouvez ajouter la saisie semi-automatique à cette nouvelle commande définissant une fonction. Info ici

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

L'ajout de 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 git-config fonctionne aussi, mais j'aime garder mes alias dans le fichier de configuration pour une facilité de 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 'alias avancés avec arguments'

13
David Claridge