web-dev-qa-db-fra.com

Comment faites-vous Git Ignorer les espaces et les onglets?

J'ai un petit projet de script composé de cinq fichiers source différents dans un répertoire appelé "droid xx-xx-xx". Chaque fois que j'ai créé une nouvelle copie de sauvegarde du répertoire source, j'ai mis la date dans les X. Il y a donc environ 15 versions différentes de différentes dates. Je veux ajouter chacune d'entre elles à mon nouveau référentiel Git à partir du plus tôt.

Cependant, j'ai rencontré plusieurs problèmes.

  1. Un problème est que certains des fichiers utilisent des onglets d'indentation, tandis que d'autres utilisent des espaces - mais GIT traite une ligne entière comme différente même lorsque la seule différence est la question de l'onglet vs. Comment puis-je faire Git ignorer la mise en forme de retrait?

  2. Un autre problème est que certains noms de fichiers auraient pas d'espace tandis que d'autres avaient des espaces entre les mots - mais Git les traite comme des fichiers différents. Pire, parfois, le nom de fichier a été changé en quelque chose de différent (comme "Patrolplan" changé "à juste" patrouiller ") sans raison réelle. Lorsque j'ajoute un nouvel ensemble de fichiers, comment puis-je dire à GIT que même si le nom de fichier est différent, ce n'est vraiment qu'une nouvelle version d'un certain fichier plus ancien? Ou mieux encore, puis-je la définir pour détecter automatiquement quand cela se produit?

  3. Le dernier problème est que certains points au cours du développement, nous avons fusionné deux fichiers source en un seul, ou d'une scission en deux - mais Git ne détecte pas automatiquement les similitudes et d'en déduire ce qui est arrivé. Comment puis-je dire à Git ce qui s'est passé? Ou mieux encore, comment puis-je le définir pour détecter automatiquement lorsque deux fichiers source ont été combinés ou quand on a été divisé?

Je me rends compte des questions (2) et (3) sont très liés. Merci d'une aide!

20
CommaToast

Comme vous avez besoin de plus de contrôle et de normalisation du processus de développement. Celui qui commet les changements devrait être la même personne qui modifie les fichiers. Ou au moins le committer devrait savoir exactement ce qui a changé.

Examiner soigneusement la sortie de git diff, et utilisez le -w Drapeau à ignorer les espaces. Il existe également des options pour montrer des différences dans une ligne. Voir diff bas dans une ligne ci-dessous.

Notez que vous ne pourrez pas dire à Git de sauter les changements d'espace lors de l'engagement. Je suggère d'utiliser GITX (je préfère la fourchette "Brotherbard"), ce qui vous permet de jeter des joints interactifs avant de vous engager.

Utilisez des messages descriptifs lors de l'engagement. Par exemple, si un fichier était divisé, dites-le. Faites vos commises petites. Si vous vous trouvez en train d'écrire de longs messages de validation, rompez-vous dans les petites parties. De cette façon, lorsque vous examinez les journaux une longue période plus tard, cela aura plus de sens ce qui a changé.

diffs dans une ligne

GIT a une certaine capacité à montrer des différences "mot" dans une seule ligne. Le moyen le plus simple est de simplement utiliser git diff --color-words.

Cependant, j'aime personnaliser la signification d'un "mot" en utilisant le diff.wordRegex config. J'aime aussi le format plain word-diffus, car il montre plus clairement où les différences sont (insère des supports autour des modifications en plus de l'utilisation de la couleur).

Commander:

git diff --Word-diff=plain

avec cela dans ma configuration:

[diff]
        wordRegex = [[:alnum:]_]+|[^[:alnum:]_[:space:]]+

Cette regex traite ces "mots":

  • cordes consécutives d'alphanumériques et de soulignes
  • cordes consécutives de non-alphanumériques, de non-traitements et de non-espaces (bon pour la détection des opérateurs)

Vous devez avoir une version récente de git pour utiliser wordRegex. Voir votre git-config Page Man à voir si l'option est répertoriée.

MISE À JOUR

Si tu utilises git mv Pour renommer un fichier (qui est préférable d'utiliser un autre outil ou le système d'exploitation à renommer), vous pouvez voir Git Détectionnant le renommer. Je recommande fortement de commettre une renommée indépendamment des modifications du contenu du dossier. C'est parce que Git ne stocke pas réellement le fait que vous avez renommé - il utilise une heuristique basée sur la quantité de fichier auquel le fichier a changé pour deviner s'il s'agissait du même dossier. Moins vous le changez lors de la renommée-commit, mieux c'est.

Si vous avez légèrement modifié le contenu du fichier, vous pouvez utiliser -C param à git diff et git log Pour essayer plus fort de détecter des copies et des renommés. Ajouter un pourcentage (par exemple -C75%) Pour rendre git plus clément des différences. Le pourcentage représente la manière dont le contenu doit être considéré comme une correspondance.

27
Kelvin
  1. Vous ne serez pas en mesure de faire des onglets/espaces Git Ignorer comme GIT crée un hachage de chaque fichier et si le hachage est différent, le fichier est considéré différent.

  2. GIT traite les arbres (répertoires) les mêmes que les fichiers; Si leur contenu change alors, ils sont différents arbres.

Je ne pense pas que ces changements ne soient toutefois rien à craindre; ils se produisent pendant tout développement. Je pense que la meilleure approche pour vous est de REPLAY Votre développement à l'aide de GIT. En d'autres termes, commencez avec votre version initiale, puis apportez les modifications nécessaires (comme vous l'avez fait à l'origine) et que GIT se souviendra de ce que vous faites.

Facultatif: Si vous souhaitez enregistrer la date/l'heure des modifications à approximativement celles à l'origine, vous pouvez utiliser le --date Option de ligne de commande à git commit Pour dire à GIT lorsque ces modifications ont été faites.

2
trojanfoe