Git Alias-commandes et paramètres multiples

j'essaie de créer un alias qui utilise à la fois des commandes Git multiples et des paramètres de position. Il y a des pages de flux empilées pour chacune, et il semblerait douloureusement évident de faire les deux, mais j'ai des problèmes.

par exemple, je veux passer à branch foo et effectuer un État. Donc dans mon .gitconfig , j'ai:

  [alias] 
     chs = !sh -c 'git checkout "151900920" && git status'

ça ne marche pas. Alors que quelque chose comme ça va marcher.

chs = !sh -c 'git checkout "151910920"'

echoes = !sh -c 'echo hi && echo bye'

Aucune information serait appréciée.

141
demandé sur montrealist 2011-09-24 00:01:27

8 réponses

cela fonctionnera (testé avec zsh et bash):

[alias] chs = !git checkout  && git status
120
répondu Olivier Verdier 2011-09-23 20:19:48

vous pouvez définir une fonction shell.

[alias] chs = "!f(){ git checkout \"\" && git status; };f"
50
répondu Kevin Ballard 2015-05-01 23:22:13

cela cible Windows batch / msysgit bash; pourrait ne pas fonctionner sur d'autres environnements.

comme L'ont dit Olivier Verdier et Kevin Ballard

[alias] chs = !git checkout && git status

fonctionne presque, mais donne une insertion supplémentaire fallacieuse de l'argument ...

git chs demo -> git checkout demo && git status demo

mais si vous ajoutez && : à la fin de votre alias, alors le faux argument est consommé dans une étiquette de localisation.

Donc

[alias] chs = !git checkout  && git status && :

donne la sortie correcte ... git chs demo -> git checkout demo && git status

48
répondu Brondahl 2017-05-25 15:21:04

j'ai pu créer des alias git multilignes et assez complexes. Ils fonctionnent bien sur les fenêtres, mais je suppose qu'ils travailleraient ailleurs aussi, par exemple:

safereset = "!f() { \
                trap 'echo ERROR: Operation failed; return' ERR; \
                echo Making sure there are no changes...; \
                last_status=$(git status --porcelain);\
                if [[ $last_status != \"\" ]]; then\
                    echo There are dirty files:;\
                    echo \"$last_status\";\
                    echo;\
                    echo -n \"Enter Y if you would like to DISCARD these changes or W to commit them as WIP: \";\
                    read dirty_operation;\
                    if [ \"$dirty_operation\" == \"Y\" ]; then \
                        echo Resetting...;\
                        git reset --hard;\
                    elif [ \"$dirty_operation\" == \"W\" ]; then\
                        echo Comitting WIP...;\
                        git commit -a --message='WIP' > /dev/null && echo WIP Comitted;\
                    else\
                        echo Operation cancelled;\
                        exit 1;\
                    fi;\
                fi;\
            }; \
            f"

j'ai écrit un post et ai quelques autres exemples ici .

17
répondu VitalyB 2015-02-13 14:56:06
[alias]
chs = !git branch && git status
13
répondu FractalSpace 2012-10-29 16:20:55

essayez celui-ci:

[alias]
    chs = "!sh -c 'git checkout \""151900920"\" && git status'"

appelez - le comme ceci: git chs master

6
répondu brocksamson 2013-04-27 17:48:09

il est possible d'avoir un pseudonyme multiligne git en ajoutant \ à la fin de chaque ligne.

[alias] 
   chs = "!git checkout  \ 
          ; git status     \
         "
3
répondu gmarik 2014-03-25 16:40:09

le problème ici est que les paramètres de position semblent être envoyés deux fois à la commande shell (à partir de git 1.9.2). Pour voir ce que je veux dire, essayez ceci:

[alias]
  test = !git echo $*

puis git test this is my testing string . Vous devriez observer la sortie suivante (les deux dernières lignes éditées ici pour plus de clarté):

03:41:24 (release) ~/Projects/iOS$ git test this is my testing string
this is my testing string this is my testing string
^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^
          #1                         #2

une façon de contourner cela serait de

[alias]
  chs = !git checkout  && git status && git echo x >/dev/null

cela consommera le paramètre de position supplémentaire comme il est appliqué à la dernière commande echo et n'ont aucun effet sur les résultats.

3
répondu Ben Collins 2014-05-08 20:40:14