Comment appliquez-vous le comportement git, y compris localement (en particulier sous Windows)?


13

Je suis en train de faire un point sur le déplacement de cette boutique .NET de svn vers git, et j'ai identifié certains problèmes auxiliaires pour lesquels j'aimerais avoir une solution avant de basculer le commutateur.

Celui que je demande en particulier dans cette question est l'application de la fin de ligne. Par défaut, git pour Windows s'installe avec le 'checkout crlf, commit lf', qui ne fonctionnera pas pour un tas de sources qui (à ma connaissance) sont exclusivement composées de terminaisons crlf.

Je ne sais pas si je ferais aveuglément confiance à un développeur donné pour configurer correctement cette instruction, même si je donne une instruction (ou les deux), mais je suis curieux de savoir si quelqu'un ici a choisi une autre voie.

  • Un hook de pré-validation qui vérifie les fins de ligne lf (ou peut-être toutes les fins de ligne lf) et les rejette dans cet événement.
  • Un script d'installation distribué aux développeurs qui remplit la configuration globale avec le «tel quel, tel quel».

PS En écrivant ceci, il m'est venu à l'esprit que la conversion initiale de svn en git pouvait valider la manière par défaut et aussi longtemps que les gens s'en tiendraient à la valeur par défaut, ce serait également assez transparent. Ayant été un développeur utilisant git dans une boutique .NET qui a installé git avec le `` tel quel, tel quel '' par défaut, j'ai également créé mes propres problèmes (ils avaient tous roulé par défaut avant mon arrivée) . Je penche donc toujours vers une sorte de mécanisme d'application.


2
Avec un côté serveur de hook de pré-réception, cela devrait être maniable (assurez-vous que les terminaisons crlf et échouent sinon), avec un hook de mise à jour, vous devriez également pouvoir mettre à jour la pré-fusion. Quel type de serveur git utilisez-vous? Si cela doit être fait côté poste de travail, un gestionnaire de configuration peut être le chemin à parcourir, mais plus difficile et avec un tas d'inconvénients. Le dernier recours est pelucheux sur CI et ne force pas les gens à suivre les procédures
Tensibai

1
Je suis d'accord avec Tensibai et j'ajouterais que l'option que vous sélectionnez doit être basée sur la rigueur avec laquelle vous pensez que cela doit être appliqué. Crochets de pré-validation pour une application stricte, peluches pour les rapports de conformité post-validation.
Dave Swersky

Merci Dave, ma justification pour une application côté client / plus stricte est que cela impliquerait moins de travail global pour moi et attraperais les erreurs plus tôt. Ne pas aller à CM les postes de travail des développeurs mais les serveurs de développement sont tous en DSC, donc l'ajout sera trivial. Edit: Merci aussi @Tensibai ... pourriez-vous expliquer les inconvénients que vous voyez côté client?
ndarwincorn

1
Surtout si vous appliquez un côté client de hook global, vous risquez de finir par empêcher le travail sur des projets nécessitant des terminaisons lf. Et vous devez le configurer d'une manière ou d'une autre, vous ne pouvez pas être sûr que tout le monde suivra la bonne configuration. Je suis sûr qu'il y a d'autres pistolets à pied auxquels je ne pense pas en ce moment
Tensibai

Qu'avez-vous fini par faire pour résoudre votre problème?
Newtopian

Réponses:


6

Pour répondre à la question de savoir comment appliquer quelque chose localement, vous ne pouvez pas sans faire de gros efforts pour gérer et appliquer l'état de chaque poste de travail de développeur, et je suis généralement d'avis que les développeurs devraient probablement être des administrateurs locaux de leur développement. parce que s'ils ne le sont pas, ils passeront simplement leur temps à comprendre comment obtenir ces privilèges de toute façon.

Et c'est probablement parce que vous ne devriez pas avoir à vous soucier de l'état de la configuration locale lorsque vous utilisez le contrôle de version distribué. Vous ne devez vous soucier que de l'état de votre configuration. En supposant que vous utilisez git comme système de contrôle de version centralisé, parce que c'est ce que tout le monde fait de toute façon parce que c'est le plus simple, alors supposons simplement que "votre" configuration est la copie de code enregistrée sur le serveur central.

Si tel est le cas, vous ne devriez pas accepter les fusions qui, comme vous l'avez mentionné, rompent les fins de ligne crlf / lf. Donc, vous appliquez cela quand un autre client essaie de pousser les changements avec une logique côté serveur qui rejette la demande de polluer votre référentiel avec leurs choix stylistiques potentiellement cassants.


4

Nous avons besoin d'un processus d'examen utilisant les demandes Pull dans github sur nos principales branches de développement ou de master. Au cours de ce processus d'examen, nous marquerons les demandes d'extraction comme nécessitant des modifications si de nombreux fichiers présentent des différences d'espace blanc ou de fin de ligne, et insistons pour qu'elles suivent le formatage de la branche de développement ou principale pour laquelle elles effectuent la demande d'extraction.

Il existe également de bons outils en fonction des langues que vous utilisez et des outils CI que vous utilisez, qui peuvent, au cours du processus de génération ou de l'étape de demande d'extraction, formater automatiquement le code en fonction des règles que vous avez définies. Cela permet également de garder le code cohérent et de minimiser les problèmes de formatage lors de la validation du code.


Souhaitez-vous élaborer sur l'outillage que vous utilisez? Étant donné qu'il existe un certain nombre de façons d'y parvenir, et que nous avons les nôtres mais que nous ne les avons pas encore réellement mises en œuvre de cette manière, je suis curieux de savoir comment vous résolvez cela.
ndarwincorn

1
Nous utilisons tapuscrit, github et jenkins. Typescript a un bel écosystème pour ce genre de chose.
avi

3

Vous pouvez utiliser la configuration par référentiel pour remplacer la configuration de l'utilisateur par référentiel. Une fois effectué sur le référentiel considéré comme la source centrale, il doit se propager avec les clones et être transféré vers d'autres dépôts, y compris locaux, remplaçant ainsi de manière centrale la configuration locale.

Vous pouvez en outre appliquer cela via des hooks dans votre référentiel central pour vérifier que les fins de fichier sont bien ce qu'elles sont censées être et rejeter la fusion / push si elle n'est pas casher. Cependant, ces hooks ne seront pas clones avec le référentiel, du moins pas directement, mais ce n'est pas nécessaire car les règles n'ont vraiment besoin d'être appliquées que sur le référentiel central.

En utilisant des modèles dans votre git init, vous pouvez vous assurer que vos dépôts sont créés égaux à tous les fichiers gitignore, gitattributes, etc. exactement comme vous le souhaitez.

Dernière chose, pas directement liée à votre question, j'ai trouvé le plus gros point de friction lors de la prise de l'équipe svn saavy à un flux de travail basé sur git quoi les habituer au repo supplémentaire au milieu. J'ai trouvé que cette feuille de repère visuelle aidait à expliquer un peu quelle commande avait quel effet pour quelle partie.

J'espère que cela a aidé un peu.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.