J'utilise git avec mon équipe et je voudrais supprimer les changements d'espaces dans mes différences, journaux, fusions, etc. ) de toutes les validations telles qu'elles sont appliquées.
J'ai essayé d'ajouter ce qui suit à par ~/.gitconfig
fichier, mais cela ne fait rien lorsque je valide. Peut-être qu'il est conçu pour quelque chose de différent. Quelle est la solution?
[core]
whitespace = trailing-space,space-before-tab
[apply]
whitespace = fix
J'utilise du rubis au cas où quelqu'un aurait des idées spécifiques au rubis. La mise en forme automatique du code avant de valider serait la prochaine étape, mais c'est un problème difficile et qui ne cause pas vraiment un gros problème.
git
whitespace
githooks
mloughran
la source
la source
Réponses:
Ces paramètres (
core.whitespace
etapply.whitespace
) ne sont pas là pour supprimer les espaces de fin, mais pour:core.whitespace
: les détecter et générer des erreursapply.whitespace
: et les supprimer, mais uniquement pendant le patch, pas "toujours automatiquement"Je pense que
git hook pre-commit
cela ferait un meilleur travail pour cela (comprend la suppression des espaces de fin)Notez qu'à tout moment, vous pouvez choisir de ne pas exécuter le
pre-commit
hook:git commit --no-verify .
cd .git/hooks/ ; chmod -x pre-commit
Avertissement: par défaut, un
pre-commit
script (comme celui-ci ), n'a pas de fonction "supprimer la fin", mais une fonction "d'avertissement" comme:Vous pourriez cependant construire un meilleur
pre-commit
crochet , surtout si vous considérez que:Par exemple, Oldman propose dans une autre réponse un
pre-commit
crochet qui détecte et supprime les espaces.Étant donné que ce hook obtient le nom de fichier de chaque fichier, je recommande de faire attention à certains types de fichiers: vous ne voulez pas supprimer les espaces de fin dans les
.md
fichiers (démarques)!la source
apply.whitespace
, en incitant git à traiter vos modifications de copie de travail comme un patch. Voir ma réponse ci-dessous ..editorconfig
fichiers ont une règle spécifique pour cela.<br>
: github.com/FriendsOfPHP/PHP-CS-Fixer/issues/…core.whitespace
detrailing-space
withgit config
ne génère pas d'erreur lors de lagit
validation dans 2.5.0.Vous pouvez inciter Git à réparer les espaces blancs pour vous, en incitant Git à traiter vos modifications comme un patch. Contrairement aux solutions de "crochet de pré-validation", ces solutions ajoutent des commandes de correction d'espaces à Git.
Oui, ce sont des hacks.
Solutions robustes
Les alias Git suivants sont extraits de my
~/.gitconfig
.Par "robuste", je veux dire que ces alias s'exécutent sans erreur, faisant la bonne chose, que l'arborescence ou l'index soient sales. Cependant, ils ne fonctionnent pas si un interactif
git rebase -i
est déjà en cours; voir mon~/.gitconfig
pour des vérifications supplémentaires si vous vous souciez de ce cas d'angle, où l'git add -e
astuce décrite à la fin devrait fonctionner.Si vous souhaitez les exécuter directement dans le shell, sans créer d'alias Git, copiez et collez tout entre les guillemets doubles (en supposant que votre shell ressemble à Bash).
Correction de l'index mais pas de l'arbre
L'
fixws
alias Git suivant corrige toutes les erreurs d'espaces dans l'index, le cas échéant, mais ne touche pas l'arborescence:L'idée est de s'exécuter
git fixws
avantgit commit
si vous avez des erreurs d'espaces dans l'index.Correction de l'index et de l'arbre
L'
fixws-global-tree-and-index
alias Git suivant corrige toutes les erreurs d'espaces dans l'index et l'arborescence, le cas échéant:Pour corriger également les espaces dans les fichiers non versionnés, procédez comme suit:
Solutions simples mais pas robustes
Ces versions sont plus faciles à copier et coller, mais elles ne font pas la bonne chose si leurs conditions secondaires ne sont pas remplies.
Correction du sous-arbre enraciné dans le répertoire courant (mais réinitialise l'index s'il n'est pas vide)
Utiliser
git add -e
pour "éditer" les patchs avec l'éditeur d'identité:
:Correction et conservation de l'index (mais échoue si l'arborescence est sale ou l'index est vide)
Correction de l'arborescence et de l'index (mais réinitialise l'index s'il n'est pas vide)
Explication de l'
export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .
astuceAvant d'apprendre l'
git rebase --whitespace=fix
astuce de cette réponse, j'utilisaisgit add
partout l'astuce la plus compliquée .Si nous l'avons fait manuellement:
Réglez
apply.whitespace
surfix
(vous ne devez le faire qu'une seule fois):Cela indique à Git de corriger les espaces dans les correctifs .
Convaincre Git de traiter vos modifications comme un patch :
Appuyez sur a+ enterpour sélectionner toutes les modifications pour chaque fichier. Vous recevrez un avertissement vous informant que Git corrige vos erreurs d'espaces.
(
git -c color.ui=auto diff
à ce stade, révèle que vos modifications non indexées sont exactement les erreurs d'espacement).Supprimez les erreurs d'espacement de votre copie de travail:
Ramenez vos modifications (si vous n'êtes pas prêt à les valider):
Le
GIT_EDITOR=:
moyen à utiliser en:
tant qu'éditeur et en tant que commande:
est l'identité.la source
set VISUAL= && git add -ue . && git checkout .
Notez le '.
' utilisé avecgit add
: c'est à cause de git1.8.3git commit
utilisation du mauvais éditeur? J'enveloppe laVISUAL=
partie dans un sous-shell dans ma version unix ci-dessus pour éviter cela, mais je ne sais pas si DOS a des sous-coques.core.editor
défini, l'exportationVISUAL
n'a aucun effet car le paramètre de configuration est prioritaire parman git-var
. Pour remplacer cela, vous devez exporter à laGIT_EDITOR=:
place.fixws
pour échouer rapidement si vous êtes déjà dans un rebase interactif car sinon il mourragit rebase --whitespace=fix
et vous laissera dans un état étrange. J'ai emprunté à cette question et j'ai juste ajouté un cas supplémentaire avant le si:fixws = !"\ if test -d $(git rev-parse --git-dir)/rebase-merge ; then \ echo 'In rebase - cannot fixws' ; \ elif (! git diff-files --quiet .) && \ (! git diff-index --quiet --cached HEAD) ; then \ ...
J'ai trouvé un hook de pré-validation git qui supprime les espaces de fin .
la source
sed
invocation (sed -r 's/:[0-9]+:.*//'
) pourrait être remplacée parcut -f1 -d:
. Cela devrait fonctionner de la même manière sur les plates-formes Linux et BSD.cut
n'est pas aussi sûre que la secondesed
: cut échouera dans le cas (très peu probable) de noms de fichiers contenant ":". Vous pouvez utiliserawk 'NF>2{NF-=2}1'
pour être en sécuritécore.autocrlf=true
, vous voudrez peut-être ajouterdos2unix -D "$FILE"
à l'intérieur de la boucle for, après sed. Sinon, il changera tous les CRLF en LF en n'émettant que sed.git add
intérieur d'un crochet de validation me semble assez mauvais. Que se passe-t-il si vous effectuez un transfert / validation partiel d'un fichier? Vous ne voulez pas que le dossier complet soit engagé derrière votre dos, n'est-ce pas?Sous Mac OS (ou, probablement, n'importe quel BSD), les paramètres de la commande sed doivent être légèrement différents. Essaye ça:
Enregistrez ce fichier sous
.git/hooks/pre-commit
- ou recherchez celui qui est déjà là, et collez le morceau inférieur quelque part à l'intérieur. Et souvenez-vous-enchmod a+x
aussi.Ou pour une utilisation globale (via les hooks de validation Git - paramètres globaux ), vous pouvez le placer
$GIT_PREFIX/git-core/templates/hooks
(où GIT_PREFIX est / usr ou / usr / local ou / usr / share ou / opt / local / share) et l'exécutergit init
dans votre référentiel existant.Selon
git help init
:la source
git hash-object -w
etgit update-index
(ré) insérer le fichier munged directement dans l'index. Quelqu'un très courageux.Je préfère laisser cette tâche à votre éditeur préféré.
Définissez simplement une commande pour supprimer les espaces de fin lors de l'enregistrement.
la source
(add-hook 'before-save-hook 'delete-trailing-whitespace)
à votre.emacs
fichier. Astuces pour les espaces blancs EmacsUtilisation des attributs git et de la configuration des filtres avec git config
OK, c'est une nouvelle approche pour résoudre ce problème… Mon approche est de ne pas utiliser de hooks, mais plutôt d'utiliser des filtres et des attributs git. Ce que cela vous permet de faire, c'est de configurer, sur chaque machine sur laquelle vous développez, un ensemble de filtres qui supprimera les espaces blancs finaux supplémentaires et les lignes vierges supplémentaires à la fin des fichiers avant de les valider. Configurez ensuite un fichier .gitattributes qui indique à quels types de fichiers le filtre doit être appliqué. Les filtres ont deux phases,
clean
qui sont appliquées lors de l'ajout de fichiers à l'index, etsmudge
qui sont appliquées lors de leur ajout au répertoire de travail.Dites à votre git de rechercher un fichier d'attributs global
Tout d'abord, dites à votre configuration globale d'utiliser un fichier d'attributs global:
Créer des filtres globaux
Maintenant, créez le filtre:
Ajoutez la magie des scripts sed
Enfin, mettez le
fixup-eol-eof
script quelque part sur votre chemin et rendez-le exécutable. Le script utilise sed pour effectuer certaines modifications à la volée (supprimer les espaces et les blancs à la fin des lignes et les lignes blanches superflues à la fin du fichier)fixup-eol-eof devrait ressembler à ceci:
mon essentiel de cela
Dites à git à quels types de fichiers appliquer votre filtre nouvellement créé
Enfin, créez ou ouvrez ~ / .gitattributes_global dans votre éditeur préféré et ajoutez des lignes comme:
Donc, si nous voulons résoudre le problème des espaces, pour tous nos fichiers source c, nous ajouterions une ligne qui ressemble à ceci:
Discussion du filtre
Le filtre a deux phases, la phase de nettoyage qui est appliquée lorsque des éléments sont ajoutés à l'index ou archivés, et la phase de maculage lorsque git place des éléments dans votre répertoire de travail. Ici, notre tache exécute simplement le contenu via la
cat
commande qui devrait les laisser inchangés, à l'exception peut-être d'ajouter un caractère de fin de ligne s'il n'y en avait pas à la fin du fichier. La commande clean est le filtrage des espaces que j'ai bricolé à partir de notes sur http://sed.sourceforge.net/sed1line.txt . Il semble qu'il doit être mis dans un script shell, je n'ai pas pu comprendre comment injecter la commande sed, y compris l'assainissement des lignes supplémentaires superflues à la fin du fichier directement dans le fichier git-config. (Vous POUVEZse débarrasser des blancs de fin, cependant, sans avoir besoin d'un script sed séparé, il suffit de définirfilter.fix-eol-eof
quelque chose commesed 's/[ \t]*$//' %f
où se\t
trouve un onglet réel, en appuyant sur tab.)L'exigence require = true déclenche une erreur en cas de problème, afin de vous éviter des ennuis.
Veuillez me pardonner si ma langue concernant git est imprécise. Je pense avoir une assez bonne compréhension des concepts mais j'apprends encore la terminologie.
la source
.git
dossier plutôt que globalement, ce qui pourrait être plus logique.J'ai écrit ce crochet de pré-validation, qui supprime uniquement l'espace blanc de fin des lignes que vous avez modifiées / ajoutées, car les suggestions précédentes ont tendance à créer des validations illisibles si les fichiers cibles ont trop d'espace blanc de fin.
la source
Veuillez essayer mes crochets de pré-validation , il peut détecter automatiquement les espaces de fin et les supprimer . Je vous remercie!
ça peut marcher sous
GitBash(windows), Mac OS X and Linux
!Instantané:
la source
git commit -no-verify
des sugesstions?.md
fichier et non de supprimer les espaces blancs, plutôt que de demander à l'utilisateur final d'ajouter une--no-verify
option sur legit commit
.+
ou-
Voici une version compatible ubuntu + mac os x:
S'amuser
la source
J'y pensais aujourd'hui. C'est tout ce que j'ai fini par faire pour un projet java:
la source
Pour les utilisateurs de Sublime Text .
Définissez correctement les paramètres suivants dans la configuration des paramètres utilisateur .
"trim_trailing_white_space_on_save": true
la source
*.md
fichiers (markdown) qui s'appuient sur "" (espaces doubles finaux) pour marquer un simple<br />
, et ce paramètre semble s'appliquer à tous les fichiers, y compris ceux dont je ne veux pas supprimer les espaces finaux.la boucle for pour les fichiers utilise la variable shell $ IFS. dans le script donné, les noms de fichiers contenant un caractère qui se trouve également dans la variable $ IFS seront considérés comme deux fichiers différents dans la boucle for. Ce script le corrige: le modificateur de mode multiligne tel que sed-manual ne semble pas fonctionner par défaut sur ma boîte Ubuntu, j'ai donc cherché une implémentation différente et l'ai trouvé avec une étiquette itérative, essentiellement il ne commencera la substitution que sur le dernière ligne du fichier si je l'ai bien compris.
[1] Modèle sed-subsition: comment remplacer une nouvelle ligne (\ n) en utilisant sed? .
la source
Cela ne supprime pas automatiquement les espaces avant un commit, mais il est assez facile à effectuer. J'ai mis le script perl suivant dans un fichier nommé git-wsf (git whitespace fix) dans un répertoire dans $ PATH pour que je puisse:
git wsf | sh
et il supprime tous les espaces uniquement des lignes de fichiers qui git les rapports en tant que diff.
la source
Un peu tard, mais comme cela pourrait aider quelqu'un là-bas, c'est parti.
Ouvrez le fichier dans VIM. Pour remplacer les onglets par des espaces, tapez ce qui suit dans la ligne de commande vim
Pour se débarrasser des autres espaces vides de fin
C'est à peu près tout pour moi. C'est fastidieux si vous avez beaucoup de fichiers à éditer. Mais je l'ai trouvé plus facile que les hooks de pré-validation et le travail avec plusieurs éditeurs.
la source
sed -i 's|\t| |g' filenames
(espaces en position de remplacement). Notez que vous pouvez utiliser find pour obtenir vos noms de fichiers. Si vous n'avez pas réfléchi à la façon d'obtenir cette sauvegarde, je valide généralement tout, puis «annule» la validation avec une réinitialisation logicielle à l'endroit où je suis; parfois j'ajoute tout à l'arborescence mais je ne m'engage pas, et parfois j'utilise le stash / apply (pas pop!). Si je me sens anxieux, je synchronise tout mon arbre vers un endroit sûr avant de me mêler ...Pour supprimer les espaces blancs de fin à la fin de la ligne d'un fichier de manière portable, utilisez
ed
:la source
Cela ne résoudra probablement pas directement votre problème, mais vous voudrez peut-être les définir via git-config dans votre espace de projet réel, qui édite ./.git/config par opposition à ~ / .gitconfig. Agréable de garder les paramètres cohérents entre tous les membres du projet.
la source