Ajouter un alias git contenant un point-virgule
-
13-11-2019 - |
Question
Quand j'essaye de créer un alias
[alias]
my-alias = submodule foreach 'git foo ; git bar'
Git (version 1.7.1) crache l'erreur
user@host:/path/repo.git$ git my-alias
error: unclosed quote
fatal: Bad alias.my-alias string
Il semble que .gitconfig
utilise des règles d'analyse étrange, afin que ;
est traité comme commençant un commentaire en ligne, même à l'intérieur d'un devis.
Comment spécifier cet alias?
La solution
Enveloppez toute la commande d'alias en doubles citations:
my-alias = "submodule foreach 'git foo ; git bar'"
Les doubles citations provoquent .gitconfig
analyseur pour passer le demi-colon. Les citations uniques sont encore nécessaires pour délimiter l'argument pour submodule foreach
; Sans eux, il est analysé comme
submodule foreach 'git foo'
git bar
pour que git bar
ne se fait exécuter qu'une seule fois, à la fin.
Autres conseils
Je ne sais pas si cela est lié au point-virgule, mais voici - voici un autre test pour Git Alias, en utilisant bash
:
[alias]
testbash = "!bash -c \"ix=1; echo a\\$ix\""
test:
$ git testbash
a1
Toute autre forme d'évasion me donne soit un vieux «Fatal: Bad Config File Line», ou «chaîne citée non terminée» ou «EOF inattendu» (voir également Shell - Appeler Bash à partir de SH (Dash) avec des commandes lues à partir des args, et "String citée non terminée" / "EOF inattendu" - Unix & Linux Stack Exchange)
Aussi pour Multiline:
[alias]
testbashm1 = "!bash -c \"ix=1; echo a\\$ix; \
echo b\\$ix \""
testbashm2 = "!bash -c 'ix=1; echo a$ix; \
echo b$ix '"
... et ajouter \n\
à la fin de la ligne, si vous souhaitez utiliser en ligne bash
commentaires (#
):
[alias]
testbashm3 = "!bash -c 'ix=1; echo a$ix; \n\
#echo b$ix ; \n\
echo \"c$ix\" ; '"
Vous devez utiliser des doubles quotidiens ("
) plutôt que des soldats ('
).
[alias]
foo = "submodule foreach 'echo foo; echo bar'"
bar = submodule foreach 'echo foo; echo bar'
$ git foo
foo
bar
$ git bar
fatal: Bad alias.bar string: unclosed quote
j'ai
[alias]
sm-clean-all = "submodule foreach --recursive 'git clean -fXd'"
Enveloppez simplement la commande en doubles quotes, par exemple:
foo = !"echo foo; echo bar"
Inclure le point-virgule pour find
, Double-Escape-le, comme:
pull-all = !"find . -name .git -type d -print -execdir git pull origin \\;"
Idem avec votre commande:
my-alias = "submodule foreach 'git foo; git bar'"
Pour le dépannage, préfixez votre commande avec GIT_TRACE=1
Pour déboguer votre alias, par exemple
$ GIT_TRACE=1 git my-alias
18:16:07.904421 git.c:282 trace: alias expansion: my-alias => 'submodule' 'foreach' 'git foo; git bar'
18:16:07.904437 git.c:557 trace: exec: 'git-submodule' 'foreach' 'git foo; git bar'
18:16:07.904443 run-command.c:347 trace: run_command: 'git-submodule' 'foreach' 'git foo; git bar'
Pour une flexibilité complète, définissez et appelez une fonction:
[alias]
conf = ! " \
f () { \
git config \"$@\" --get-regexp . \
| sort; \
}; \
f"
Cet alias peut être appelé comme git conf
, git conf --local
ou git conf --global
, et les options supplémentaires sont insérées à l'endroit approprié.