J'essaie de créer un alias qui utilise à la fois plusieurs commandes Git et des paramètres de position. Il y a des pages Stackoverflow pour chacune, et il semblerait douloureusement évident de faire les deux, mais j'ai des problèmes.
Par exemple, je veux passer à la branche foo et effectuer un statut. Donc dans mon .gitconfig
, j'ai:
[alias]
chs = !sh -c 'git checkout $0 && git status'
ce qui ne marche pas. Alors que quelque chose comme ça fonctionnera.
chs = !sh -c 'git checkout $0'
echoes = !sh -c 'echo hi && echo bye'
Toute idée serait appréciée.
Réponses:
Cela fonctionnera (testé avec zsh et bash):
[alias] chs = !git checkout $1 && git status
la source
git chs foo
engit checkout && git status foo
echo $1 && echo done
, lorsqu'il est appelé avec l'argument 'foo', affichera à la fois "foo" et "done foo".git
?!
moyen passe le tout au shell. Sinon, cela suppose que vous essayez d'exécuter une autre commande git et la transmet comme arguments augit
binaire.;:
plutôt&& :
que. Et cela fonctionne très bien aussi sous Unix.Cela cible Windows batch / msysgit bash; peut ne pas fonctionner sur d'autres environnements.
Comme l'ont dit Olivier Verdier et Lily Ballard
[alias] chs = !git checkout $1 && git status
fonctionne presque, mais donne une fausse insertion supplémentaire de l'argument ...
git chs demo -> git checkout demo && git status demo
Mais si vous ajoutez
&& :
à la fin de votre alias, alors l'argument faux est consommé dans une balise d'emplacement.Donc
[alias] chs = !git checkout $1 && git status && :
donne la sortie correcte ...
git chs demo -> git checkout demo && git status
la source
&& :
est d'or et fait fonctionner cette solution pour les commandes où l'argument supplémentaire serait problématique.&& :
fait?a=123;$a
erreurs, maisa=123; : $a
pas. 2.: > hello.txt
vide hello.txt. 3.if [ "$a" = "hello" ];then : ;fi
fonctionne correctement mais les erreurs sans ":". C'est commepass
en python. 4.: this is a comment
, les deux points suivis d'un espace fonctionnent comme#
dans une ligne de commentaire.co = !git checkout public/compiled && git checkout $1
et quand je le ferais,git co master
je recevais le messageerror: pathspec 'master' did not match any file(s) known to git.
. Je ne pensais pas que cette réponse me serait utile car la première chose qu'elle mentionne est Windows et je suis sous Linux. Mais tu as expliqué pourquoi.Vous pouvez définir une fonction shell.
[alias] chs = "!f(){ git checkout \"$1\" && git status; };f"
la source
"
J'ai pu créer des alias git multi-lignes et assez complexes. Ils fonctionnent bien sur Windows mais je suppose qu'ils fonctionneraient également ailleurs, 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 article et j'ai quelques autres exemples ici .
la source
!f() { : reset
pour obtenir les complétions de la commande de réinitialisation github.com/git/git/blob/master/contrib/completion[alias] chs = !git branch && git status
la source
!
pour?!
mais pour autant que je puisse voir, git par défaut supposera que l'alias est une commande git donct = status
fonctionnera. Cependant, si vous essayez,t = git status
cela ne fonctionnera pas (dira "git" command not found). Alors que là où le!
vient, il lui dit d'exécuter la commande comme s'il s'agissait d'un shell, et normalement vous en avez besoin lorsque vous avez plusieurs commandes git par alias, donc vous pouvez avoirt = !git status && git log
par exemple et cela fonctionnera.Essaye celui-là:
[alias] chs = "!sh -c 'git checkout \"$0\" && git status'"
Appelez ça comme ça:
git chs master
la source
Il est possible d'avoir un alias git multiligne en ajoutant
\
à la fin de chaque ligne.[alias] chs = "!git checkout $1 \ ; git status \ "
la source
"!git fetch --prune --all; git pull --rebase upstream master; git push origin master"
pour mon alias.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 $*
Alors fais
git test this is my testing string
. Vous devriez observer la sortie suivante (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 ce problème serait de
[alias] chs = !git checkout $1 && git status && git echo x >/dev/null
Cela consommera le paramètre positionnel supplémentaire lors de son application à cette dernière commande d'écho et n'aura aucun effet sur les résultats.
la source
Un exemple pour les personnes qui veulent essayer ce que font différents alias.
Mettre ceci dans la section alias du fichier de configuration de GIT (par exemple
~/.gitconfig
):[alias] a0 = "!echo $*" a1 = "!echo $* #" a2 = "!f () { echo \"$*\"; }; f " a3 = "!f () { echo \"$*\"; }; f #" a4 = "!f () { echo \"$*\"; }; f \"$*\" #" a5 = "!f () { echo \"$*\"; }; f \"$@\" #" a6 = "!f () { echo \"$*\"; }; f \"$1\" #"
Et puis en exécutant cette commande:
cat ~/.gitconfig | grep --extended-regexp -- '(a[0-9])|(alias)' ; \ echo "" ; \ export CMD ; \ for I in {0..6} ; \ do \ CMD="a""${I}" ; \ echo -n "Executing alias.${CMD} = " ; \ git config --global alias."${CMD}" ; \ git $CMD 'hoi daar' en nu? ; \ git $CMD hoi daar en nu? ; \ echo "" ; \ done ; \ unset CMD ;
Devrait donner ceci en sortie:
[alias] a0 = "!echo $*" a1 = "!echo $* #" a2 = "!f () { echo \"$*\"; }; f " a3 = "!f () { echo \"$*\"; }; f #" a4 = "!f () { echo \"$*\"; }; f \"$*\" #" a5 = "!f () { echo \"$*\"; }; f \"$@\" #" a6 = "!f () { echo \"$*\"; }; f \"$1\" #" Executing alias.a0 = !echo $* hoi daar en nu? hoi daar en nu? hoi daar en nu? hoi daar en nu? Executing alias.a1 = !echo $* # hoi daar en nu? hoi daar en nu? Executing alias.a2 = !f () { echo "$*"; }; f hoi daar en nu? hoi daar en nu? Executing alias.a3 = !f () { echo "$*"; }; f # Executing alias.a4 = !f () { echo "$*"; }; f "$*" # hoi daar en nu? hoi daar en nu? Executing alias.a5 = !f () { echo "$*"; }; f "$@" # hoi daar en nu? hoi daar en nu? Executing alias.a6 = !f () { echo "$*"; }; f "$1" # hoi daar hoi
la source