44 votes

Comment gérer les changements généralisés de format de code dans un dépôt git ?

Nous avons un projet d'environ 500 000 lignes de code, géré avec git, dont une grande partie date de plusieurs années. Nous sommes sur le point d'effectuer une série de modifications pour mettre l'ancien code en conformité avec les normes et les meilleures pratiques actuelles de la communauté des développeurs, en ce qui concerne les conventions de dénomination, la gestion des exceptions, l'indentation, etc.

On peut considérer qu'il s'agit de quelque chose qui se situe entre l'impression et le remaniement mécanique de bas niveau.

Ce processus est susceptible de toucher presque chaque ligne de code de la base de code (~85%), et certaines lignes feront l'objet de jusqu'à cinq modifications. Toutes les modifications sont destinées à être sémantiquement neutres.

  • Existe-t-il un moyen de rendre les changements transparents pour le git blame, etc., de sorte que lorsque l'on regarde le code dans un mois, on voit le commit dans lequel la logique a été introduite, et non celui dans lequel l'indentation ou la capitalisation a été modifiée ?
  • Quelle est la meilleure façon de tirer des fusions de fourches qui n'ont pas subi ce processus ? Mon plan actuel serait qu'un script clone le repo fork, applique le processus automatisé à celui-ci et à sa base, les diffère, puis applique la diff. Mais j'aimerais avoir une réponse plus propre.
  • Y a-t-il d'autres problèmes de ce type que je ne vois pas, et si oui, que peut-on faire pour les atténuer ? Je pense que git bisect, etc. devrait être correct, git log, etc. traversant le grand fossé sera ennuyeux à moins que vous ne soyez prudent, et git diff sera sans espoir, mais je ne suis pas convaincu que je ne néglige pas un autre point sensible.

24voto

Phil Points 2513

Je ne sais pas comment gérer au mieux certains des changements les plus invasifs que vous décrivez, mais...

Le site -w option pour git blame , git diff et d'autres font que git ignore les changements dans les espaces blancs, ce qui vous permet de voir plus facilement les vraies différences.

11voto

VonC Points 414372

Je recommanderais de faire ces évolutions une étape à la fois, dans un dépôt Git central (central comme dans "référence publique pour que tous les autres dépôts puissent suivre) :

  • indentation
  • puis des méthodes de réorganisation
  • puis en renommant
  • alors...

Mais pas "indentation-réorganisation-renouvellement-...-un commit géant".

De cette façon, vous donnez à Git une chance raisonnable de suivre les changements à travers les modifications de refactoring.

De plus, je n'accepterais aucune nouvelle fusion (tirée d'un autre dépôt) qui n'aurait pas appliqué la même refactorisation avant de pousser son code.
Si l'application du processus de formatage apporte des changements au code récupéré, vous pouvez le rejeter et demander que le repo distant se conforme d'abord aux nouvelles normes (au moins en retirant de votre repo avant d'effectuer d'autres poussées).

10voto

krosenvold Points 35979

Vous aurez également besoin d'un outil de fusion qui permet d'ignorer les espaces. p4merge le fait, et est téléchargeable gratuitement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X