Ajoutez ce qui suit à votre .gitconfig:
anw = !git diff -U0 -w --no-color -- \"$@\" | git apply --cached --ignore-whitespace --unidiff-zero "#"
Merci à la réponse de @Colin Herbert pour l'inspiration.
Explication de la syntaxe
La finale #doit être citée afin qu'elle ne soit pas traitée comme un commentaire à l'intérieur du .gitconfig, mais à la place est passée à travers et est traitée comme un commentaire à l'intérieur du shell - elle est insérée entre la fin du git applyet les arguments fournis par l'utilisateur qui gitles placent automatiquement au fin de la ligne de commande. Ces arguments ne sont pas recherchés ici - nous ne voulons git applypas les consommer, d'où le caractère de commentaire précédent. Vous voudrez peut-être exécuter cette commande GIT_TRACE=1 git anwpour voir cela en action.
Les --signaux signifient la fin des arguments et permettent le cas où vous avez un fichier nommé -wou quelque chose qui ressemblerait à un commutateur git diff.
Les guillemets doubles échappés $@sont requis pour conserver tous les arguments cités fournis par l'utilisateur. Si le "personnage n'est pas échappé, il sera consommé par l' .gitconfiganalyseur et n'atteindra pas le shell.
Note: l' .gitconfiganalyse syntaxique d'alias ne reconnaît pas les guillemets simples comme quelque chose de spécial - ses caractères spéciaux ne sont ", \, \net ;( en dehors d'une "chaîne entre guillemets). C'est pourquoi un "doit toujours être échappé, même s'il semble qu'il se trouve à l'intérieur d'une chaîne entre guillemets simples (dont git est complètement agnostique).
C'est important, par exemple. si vous disposez d'un alias pratique pour exécuter une bashcommande à la racine de l'arborescence de travail. La formulation incorrecte est:
sh = !bash -c '"$@"' -
Alors que la bonne est:
sh = !bash -c '\"$@\"' -
git apply --ignore-whitespacesinon le patch ne s'appliquerait pas pour des raisons évidentes.