J'ai mon éditeur de texte pour couper automatiquement les espaces de fin lors de l'enregistrement d'un fichier, et je contribue à un projet open source qui a de graves problèmes avec les espaces de fin.
Chaque fois que j'essaie de soumettre un patch, je dois d'abord ignorer manuellement toutes les modifications uniquement sur les espaces, pour ne choisir que les informations pertinentes. Non seulement cela, mais lorsque je cours, git rebase
je rencontre généralement plusieurs problèmes à cause d'eux.
En tant que tel, je voudrais pouvoir ajouter à l'index uniquement des modifications non blanches, d'une manière similaire à celle- git add -p
ci, mais sans avoir à choisir moi-même toutes les modifications.
Est-ce que quelqu'un sait comment faire ça?
EDIT: Je ne peux pas changer la façon dont le projet fonctionne, et ils ont décidé, après en avoir discuté sur la liste de diffusion, de l'ignorer.
la source
git apply --ignore-whitespace
sinon le patch ne s'appliquerait pas pour des raisons évidentes.git add -w
ça l'a fait.patch does not apply
eterror while searching for
... Des idées?patch does not apply
erreur.git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero
. Ce n'est pas risqué car l'index est déjà aussi à jour que possible, c'est donc une base fiable pour le patch.Cela fonctionne pour moi:
Si vous voulez garder une cachette, cela fonctionne
Je ne aime pas les stashes, mais je l' ai rencontré un bogue dans git + Cygwin où je perds des changements, afin de vous assurer que des choses est allé au reflog au moins je définir les paramètres suivants:
Fondamentalement, nous créons un diff qui n'inclut pas les changements d'espace, annulons tous nos changements, puis appliquons le diff.
la source
git stash
au lieu de payer, pour avoir une sauvegarde de vos modifications, au moins jusqu'à ce qu'il soit testé.Créez un fichier de correctif contenant uniquement les modifications réelles (à l'exclusion des lignes avec uniquement des modifications d'espaces blancs), puis nettoyez votre espace de travail et appliquez ce fichier de correctif:
Passez en revue les différences restantes, puis
add
etcommit
comme d'habitude.L'équivalent pour Mercurial est de faire ceci:
la source
La réponse la plus votée ne fonctionne pas dans tous les cas, en raison des espaces dans le contexte du correctif selon les utilisateurs dans les commentaires.
J'ai révisé la commande comme suit:
Cela génère un patch sans contexte. Cela ne devrait pas être un problème car le patch est de courte durée.
Alias correspondant, encore une révision de ce qui était déjà fourni par les autres utilisateurs:
la source
--ignore-space-change
place de-w
.git diff -U0 --ignore-space-change --no-color | git apply --cached --unidiff-zero
--ignore-blank-lines
autre, vous trouverez des morceaux de diff corrigés à des décalages incorrects si certains des changements de l'espace blanc que vous cherchez à ignorer sont des suppressions / ajouts de lignes vides.Ajoutez ce qui suit à votre
.gitconfig
: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 dugit apply
et les arguments fournis par l'utilisateur quigit
les placent automatiquement au fin de la ligne de commande. Ces arguments ne sont pas recherchés ici - nous ne voulonsgit apply
pas les consommer, d'où le caractère de commentaire précédent. Vous voudrez peut-être exécuter cette commandeGIT_TRACE=1 git anw
pour voir cela en action.Les
--
signaux signifient la fin des arguments et permettent le cas où vous avez un fichier nommé-w
ou quelque chose qui ressemblerait à un commutateurgit 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'.gitconfig
analyseur et n'atteindra pas le shell.Note: l'
.gitconfig
analyse syntaxique d'alias ne reconnaît pas les guillemets simples comme quelque chose de spécial - ses caractères spéciaux ne sont"
,\
,\n
et;
( 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
bash
commande à la racine de l'arborescence de travail. La formulation incorrecte est:Alors que la bonne est:
la source
Qu'en est-il des éléments suivants:
La commande à l'intérieur des guillemets arrière obtient les noms des fichiers dont les espaces ne sont pas modifiés.
la source
git add `git diff -w |grep '^+++' |cut -c7-`
si les sous-modules ne sont pas utilisésVous devez d'abord déterminer si l'espace blanc de fin est intentionnel. De nombreux projets, y compris le noyau Linux, Mozilla, Drupal et Kerberos (pour n'en nommer que quelques-uns sur la page Wikipédia sur le style) interdisent les espaces vides. De la documentation du noyau Linux:
Dans votre cas, le problème est l'inverse: les validations précédentes (et peut-être les actuelles) n'ont pas suivi cette directive.
Je parie que personne ne veut vraiment l'espace blanc arrière, et résoudre le problème pourrait être un changement bienvenu. D'autres utilisateurs peuvent également rencontrer le même problème que vous. Il est également probable que le ou les contributeurs qui ajoutent des espaces de fin ne savent pas qu'ils le font.
Plutôt que d'essayer de reconfigurer git pour ignorer le problème, ou de désactiver la fonctionnalité autrement souhaitable dans votre éditeur, je commencerais par un message sur la liste de diffusion du projet expliquant le problème. De nombreux éditeurs (et git lui-même) peuvent être configurés pour gérer les espaces de fin.
la source
J'ai trouvé un crochet git pré-commit qui supprime les espaces de fin . Cependant, si vous ne parvenez pas à faire en sorte que d'autres personnes l'utilisent, cela pourrait ne pas être une solution valide.
la source