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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top