Le code temporaire doit-il être placé sous contrôle de version et comment?

29

Voici quelques exemples de code temporaire / local. Il est nécessaire pour travailler avec la base de code, mais il serait dangereux d'en faire partie:

  1. Fichiers de projet. Il peut être nécessaire de modifier les chemins afin de refléter la disposition sur le PC actuel.
  2. Makefiles. Par exemple, l'optimisation peut devoir être désactivée pendant le débogage, mais pas pour le serveur CI.
  3. Hacks laids sales. Par exemple, return 7au milieu d'une fonction, afin de tester quelque chose, selon la fonction, et soupçonné de casser à la valeur 7. Ou 7 est le code du bouton pas encore implémenté, que j'implémente et que je dois tester tout au long la vie de ma branche.

J'ai essayé de garder ceux-ci dans un git commit que je rebase toujours en haut avant de pousser vers le repo puis de pousser HEAD~. C'est assez gênant et ne fonctionne pas avec svn. Cacher me fait encore plus peur - "Est-ce que je me souviens d'avoir sauté après avoir poussé ??"

Garder le code hors du contrôle de version introduit un bruit désagréable à chaque fois qu'un commit est assemblé et il peut accidentellement être introduit dans un commit un vendredi soir.

Quelle serait une solution sensée pour un tel code à jeter?

Vorac
la source
Ce code temporaire devra-t-il être mis à jour à partir du projet d'origine pendant sa période d'utilisation temporaire?
JeffO
@JeffO, je ne sais pas si je vous comprends. Les extraits sales sont petits et se heurtent rarement au code en cours de développement. Cependant, @ Blrfl, il est très dangereux pour eux d'être engagés dans le courant dominant. Imaginez un return 7dans le trunkvendredi soir, après une fusion moche dans la chaleur de l' été.
Vorac
@Vorac - c'est à ça que servent les revues de code et les tests! Je peux vous montrer bien pire que cela - un code qui ne fonctionne pas même s'il avait l'air bien à première vue. Return 7.. si seulement ils étaient si évidents!
gbjbaanb
@Vorac: C'était plus un commentaire philosophique qu'autre chose.
Blrfl
2
Existe-t-il un moyen de savoir dans quel environnement vous vous trouvez? Par exemple, vous pouvez le configurer pour exécuter du code s'il détecte que vous êtes dans l'environnement de développement, mais pas dans val / prod. De cette façon, vous n'avez pas à ajouter / supprimer constamment du code d'espace réservé lors de la validation.
Saggio

Réponses:

46

Tout le code est temporaire. Lorsque je fais des changements, j'introduis de temps en temps des espaces réservés - cette icône que j'ai dessinée en attendant la vraie du concepteur, la fonction que je connais appellera la bibliothèque que mon collègue écrit et n'a pas encore terminée (ou démarrée), la journalisation supplémentaire qui sera supprimée ou conditionnée d'une autre manière, les bugs que je vais corriger une fois qu'ils auront été remarqués par l'équipe de test, etc.

Alors vérifiez tout. Utilisez une branche de fonctionnalité pour tout votre développement, puis vous pouvez fusionner la version finale dans le tronc et personne n'aura besoin de savoir quels hacks et bodges et correctifs vous avez faits pendant votre cycle de développement, ils n'auront besoin que de voir la version finale. Mais si vous vous êtes engagé régulièrement dans votre branche, vous pourrez voir les choses qui valaient la peine d'être conservées si une journée se déroulait de façon spectaculaire, ou si vous continuiez à coder après un déjeuner dans le pub.

Le contrôle de version n'est pas un référentiel d'artefacts ou un système de stockage de documents. Il s'agit de tenir l'histoire des changements. Collez tout ce que vous aimez là-dedans parce qu'un jour vous voudrez peut-être voir ce que c'était, et ce sont les jours où vous réalisez ce qu'est vraiment votre SCM.

PS. Les fichiers vraiment temporaires (par exemple .obj ou build artefacts) n'ont pas leur place dans votre SCM. Ce sont des choses qui n'ont de valeur pour personne. Vous pouvez dire ce qu'ils sont - si vous les supprimez, cela ne vous dérange pas, ou même remarquez qu'ils sont partis.

gbjbaanb
la source
5
D'accord. La ramification est la voie à suivre. Créez une branche, faites ce que vous voulez et fusionnez le code fini une fois terminé. La tête doit être traitée comme une version finale que le client peut télécharger et utiliser à tout moment.
Cameron McKay
Excellente réponse, d'après ce que j'ai vu, GIT a introduit le versioning local en partie pour aider les personnes qui souhaitent avoir un journal de leur travail local. Le code temporaire doit rester dans les machines des développeurs jusqu'à ce qu'il soit prêt à les valider dans le dépôt
InformedA
2
Je vais imprimer une grande affiche disant "TOUT CODE EST TEMPORAIRE" et le coller sur le mur. Probablement dans Comic Sans.
Bob Tway
2
@MattThrower dans une citation de bulle, venant des lèvres de Clippy?
gbjbaanb
1
Le code non en cours d'exécution ou le code qui ne se compile pas ne doit cependant pas être validé pour le contrôle de version.
Tulains Córdova
17

Fichiers de projet. Il peut être nécessaire de modifier les chemins afin de refléter la disposition sur le PC actuel.

Pour les fichiers de projet, la meilleure stratégie consiste à générer le fichier de projet via un script. Ajoutez le fichier de projet réel à vos ignores et générez simplement le fichier de projet si nécessaire. Par exemple, dans les projets Java, j'utilise gradle qui peut générer un projet éclipse.

Makefiles. Par exemple, l'optimisation peut devoir être désactivée pendant le débogage, mais pas pour le serveur CI.

Vous devriez pouvoir basculer entre le mode d'optimisation et de débogage sans modifier votre Makefile. À la place, utilisez un indicateur de ligne de commande, une variable d'environnement ou un fichier séparé qui ne se trouve pas dans votre référentiel pour contrôler cela.

Hacks laids sales. Par exemple, retournez 7 au milieu d'une fonction, afin de tester quelque chose, selon la fonction, et suspecté de casser à la valeur 7. Ou 7 est le code du bouton pas encore implémenté, que j'implémente et que je dois tester tout au long de la vie de ma branche.

Vous ne pouvez pas écrire un test qui induit le cas d'échec suspecté?

Dans la plupart des cas, vous devriez pouvoir ajuster votre flux de travail afin de ne pas apporter ces modifications aux fichiers de votre référentiel. Ces fichiers qui sont modifiés localement doivent être ajoutés au mécanisme d'ignorance de votre projet et ne pas être dans le référentiel. Dans certains cas, vous continuerez à apporter des modifications temporaires que vous ne souhaitez pas mettre dans le référentiel. Pour ceux-ci, ajoutez une séquence spéciale comme: XXX, et ajoutez un hook de pré-validation qui rejette les validations qui y figurent encore.

Winston Ewert
la source
Parfois, j'ai besoin de faire de petits hacks dans un fichier, tout en écrivant du code de production dans le même fichier. svnne prend pas en charge les validations de fichiers partielles, c'est donc une douleur dans ces situations. La plupart de mes collègues confient les hacks à la succursale et les purgent lors de la fusion trunk. Cependant, je suis distrait (et je fais des erreurs pendant les fusions, et les fusions dans svn sont sacrées et immuables) de manière plus facile et donc cette question.
Vorac
@Vorac, j'examinerais les crochets de subversion qui vous permettent d'exécuter des scripts lors de la validation. Il devrait être possible d'écrire un script qui rejette une fusion s'il contient XXX ou quelque chose comme ça.
Winston Ewert
1
@Vorac: Si vous utilisez TortoiseSVN, vous pouvez utiliser Restore After Commit sur un fichier pour valider partiellement, utilisez un outil de diff ou votre éditeur pour supprimer temporairement les blocs que vous ne voulez pas valider, puis validez. Tortoise restaurera le fichier complet juste après et vous pouvez valider les blocs restants si vous êtes prêt. Cela pourrait être fait en effectuant une sauvegarde rapide du fichier et en le restaurant après le premier commit.
leokhorn
5

Le contrôle de version doit contenir le code et la configuration nécessaires à la création de l'application.

Cela signifie que:

  • Les éléments temporaires qui ont été introduits pendant un court laps de temps (le temps nécessaire pour localiser l'emplacement d'un bogue ou pour expérimenter une fonctionnalité d'une langue, par exemple) ne devraient pas être dans un contrôle de version: conservez-le jusqu'à ce que vous en ayez besoin , puis supprimez-le simplement lors de la validation .

  • Les fichiers locaux propres à une machine particulière peuvent être conservés dans une branche.

    J'éviterais de les garder juste localement, car c'est trop pénible de refaire tout ça quand votre ordinateur portable est volé ou qu'un virus vous oblige à réinstaller le système d'exploitation (et d'ailleurs, vous constatez que votre dernière sauvegarde a été effectuée il y a deux ans) .

    D'un autre côté, soyez prudent avec la structure des fichiers: la configuration locale est OK, jusqu'à ce qu'elle devienne écrasante, et vous oblige à faire un seul changement dans chaque fichier de chacun des 42 développeurs participant au projet.

    Surveillez l'opportunité de supprimer les particularités entre les machines. Cela peut signifier:

    • Donner un accès à un serveur SQL dev pour remplacer les instances locales sur les machines des développeurs,

    • Utiliser des services de distribution de packages comme Pypi ou npm pour les packages publics et leurs homologues privés pour les packages internes,

    • Demandez aux membres de l'équipe d'installer les mêmes versions de logiciels,

    • Rendez les mises à jour logicielles aussi transparentes que possible,

    • Ou permettre de déployer le système d'exploitation et les logiciels nécessaires sur une machine en un clic (plus le temps pour chaque développeur d'installer son Vim vs Emacs préféré, Chrome vs Firefox, etc.)

Alors:

Fichiers de projet. Il peut être nécessaire de modifier les chemins afin de refléter la disposition sur le PC actuel.

Pourquoi ne pas utiliser la même disposition sur chaque PC? Les chemins au sein du projet doivent être relatifs au fichier de projet, ce qui signifie que peu importe où se trouve le projet. Les versions des logiciels et des bibliothèques doivent être identiques pour éviter les bogues cryptiques qui n'apparaissent que sur certaines machines et sont impossibles à reproduire pour les autres membres de l'équipe.

Exemple:

Dans un projet créé avec Visual Studio, vous pouvez trouver:

  • Les fichiers eux-mêmes. Les chemins étant relatifs, peu importe que sur ma machine, le projet soit localisé pendant H:\Development\Hello World Project\que d'autres membres de l'équipe l'ont extrait C:\Work\HelloWorld\.

  • Les dépendances, c'est-à-dire les bibliothèques tierces et internes. Les deux types doivent être gérés par NuGet, ce qui rend toutes les discussions liées aux conflits obsolètes. Si vous n'avez pas la même version de la bibliothèque que moi, demandez à NuGet de mettre à jour les dépendances. Aussi simple que ça (quand ça marche bien, ce qui n'est pas toujours le cas).

    Notez qu'il est crucial de conserver également les bibliothèques internes dans un NuGet privé. Avoir un tas de bibliothèques stockées dans un dossier partagé ou envoyées par e-mail à travers une équipe conduit à l'anarchie et aux serveurs CI dépressifs.

  • Les paramètres. Il est crucial que l'équipe partage les mêmes paramètres. Si la moitié de l'équipe décide de traiter les avertissements comme des erreurs et la moitié de l'équipe conserve les avertissements tels quels, les membres de la première partie de l'équipe passeront leur temps à supprimer les avertissements générés par les développeurs de la deuxième partie de l'équipe.

  • Les paramètres liés aux utilitaires. Celles-ci sont délicates, car certains membres de l'équipe peuvent avoir installé certains utilitaires, tandis que d'autres ne l'ont pas fait.

    Il est fortement recommandé d'installer le même ensemble d'outils. Si certains programmeurs veulent utiliser StyleCop, mais d'autres non, l'équipe ne fera pas le travail. Si certains utilisent des contrats de code mais d'autres pas, ils auront les mêmes problèmes.

Makefiles. Par exemple, l'optimisation peut devoir être désactivée pendant le débogage, mais pas pour le serveur CI.

Gardez plusieurs makefiles dans le contrôle de version. Il n'est pas rare de créer une version de débogage sur le serveur CI et de la pousser vers un client qui rencontre un bug délicat.

Hacks laids sales. Par exemple, retournez 7 au milieu d'une fonction, afin de tester quelque chose, selon la fonction, et soupçonné de casser à la valeur 7.

J'éviterais un tel code en premier lieu. Pour tester quelque chose, utilisez des tests unitaires. Si cela prend vraiment quelques secondes pour échanger du code à des fins de débogage , faites-le, mais vous supprimerez ce code dans quelques minutes de toute façon, il n'est donc pas nécessaire de le valider.

Comme vous le décrivez, vous devez écrire un test. Par exemple, si vous voulez être sûr que:

class TemperatureConverter
{
    public int CelsiusToFahrenheit(int temperature)
    {
        ...
    }
}

lève une exception lorsqu'il temperatureest inférieur à AbsoluteZeroconstant, vous ne devez pas jouer avec le code lui-même. Créez plutôt un test unitaire qui:

  • auto-documenter votre code,
  • augmenter la fiabilité de votre code,
  • s'assurer que les responsables peuvent s'appuyer sur des tests de régression lors de la modification de la méthode ci-dessus,
  • servir aux autres développeurs de votre équipe qui peuvent avoir besoin de faire le même test.
Arseni Mourzenko
la source
2
Malheureusement, je n'ai pas d'expérience en rédaction de tests. La plate-forme actuelle implique un processeur ARM, configurant du matériel en réponse aux commandes USB. Il n'y a aucun retour du matériel vers le processeur.
Vorac
2
Si le code temporaire peut avoir des effets persistants, même si le code peut ne jamais être nécessaire une fois que ces effets ont été obtenus, je pense que garder le code quelque part serait sage au cas où il y aurait des questions pour savoir si les effets ont été obtenus correctement. Par exemple, si le format de la base de données d'un produit est modifié pendant son développement, on peut écrire un utilitaire rapide et unique pour changer le format. L'utilitaire peut ne jamais être nécessaire après la conversion de la seule base de données existante dans l'ancien format, mais il peut néanmoins être nécessaire d'examiner comment la conversion a été effectuée.
supercat
Pour les fichiers de projet Visual Studio, j'ai eu de bonnes expériences en les générant avec CMake, ce qui permet une certaine flexibilité sur la façon dont le code source et le code compilé sont situés dans le système de fichiers. Ensuite, je contrôle la version des fichiers d'entrée CMake au lieu des fichiers de projet VS. Mais cela est toujours conforme à votre dicton, "Le contrôle de version doit contenir le code et la configuration qui sont nécessaires pour construire l'application." Je suis totalement d'accord avec ça!
David K
Avec VS, il faut parfois prendre soin de vous assurer de ne pas avoir des chemins absolus se faufilant dans j'ai couru dans plus de quelques problèmes avec des références éclatés lorsque vous passez à win64 et ayant des bibliothèques pour les plates - formes 3ème partie se déplacent de. C:\Program Files\...ÀC:\Program Files (x86)\...
Dan Neely
@DanNeely: c'est pourquoi les bibliothèques tierces doivent être gérées par NuGet.
Arseni Mourzenko
2

Nous utilisons des @@commentaires dans le code pour indiquer tout ce qui n'est pas tout à fait prêt, à des fins de test, etc.

De cette façon, nous pouvons nous engager, les collègues n'ont pas à attendre trop longtemps pour se synchroniser et peuvent voir où il y a encore du travail en cours (par exemple, comprendre pourquoi une pièce ne fonctionne pas encore complètement).

Nous effectuons une recherche globale pour @@éviter tout `` reste '' avant d'entrer dans les étapes finales des tests bêta, etc.

En utilisant cette discipline, je ne vois aucune raison de ne pas simplement m'engager. De cette façon, nous n'avons pas de branches distinctes et un seul «protocole» supplémentaire à suivre.


Comme avantage supplémentaire, ces tâches (généralement de petites choses) sont toujours dans le code. Le développeur qui y travaille peut les parcourir rapidement et il n'est pas nécessaire de conserver des listes distinctes.
Vous savez comment se déroule le développement: vous travaillez au même endroit, mais vous utilisez constamment votre esprit comme une pile (« je devrais changer cela là-bas quand j'aurai fini ici »). Le simple @@fait de noter une remarque rapide empêche le débordement de la pile.

J'utilise même @@namepour indiquer les problèmes dont je dois discuter avec «nom».

Jan Doggen
la source
1

2 solutions HAMSTER:

  • Vous pouvez utiliser un hook de pré-validation pour vérifier votre code pour certains mots-clés inhabituels comme HAMSTER. Ne laissez pas les gens commettre du code HAMSTERed et utilisez-le chaque fois que vous faites des hacks sales.

  • Une autre option par exemple en C est d'utiliser #ifdef HAMSTER, alors le code ne s'exécutera que sur votre machine où vous avez un indicateur de compilateur HAMSTER.

user143985
la source
0

Nous mettons tout sous contrôle de source nécessaire pour construire et tester les binaires actuels et comprendre pourquoi les choses ont été conçues / implémentées / testées telles qu'elles sont.

Cela vaut même pour les pointes http://www.extremeprogramming.org/rules/spike.html , comme celles que vous avez décrites; nous les hébergeons simplement dans un sous-arbre différent.

Solkar
la source
0

Voici un certain nombre de solutions que j'utilise moi-même occasionnellement dans diverses circonstances, et que vous pourriez considérer utiles lorsqu'elles sont appliquées à vos propres flux de travail:

  1. Branches légères qui peuvent être écrasées.

    Git est super à ça. Piratez une branche, effectuez de nombreuses validations, puis rebasez ou écrasez votre historique pour supprimer le bruit.

  2. Utilisez une file d'attente de correctifs au-dessus de votre SCM.

    Je me retrouve souvent à utiliser StGit pour faire flotter les correctifs vers le haut de ma branche actuelle. Lorsque j'ai terminé avec la branche, je peux les retirer de la pile avant de les fusionner, les écraser ou les rebaser, ou les fusionner dans la base de code principale si je veux les garder.

  3. Utilisez RCS comme SCM "hors bande" pour de petites expériences.

    Parfois, vous voulez simplement vérifier un fichier en cours de manière jetable, sans avoir à nettoyer l'historique par la suite. J'utilise généralement RCS pour cela à l'intérieur de Git ou SVN. Je dis à Git d'ignorer les artefacts RCS, de vérifier mon travail en cours dans RCS, et quand j'aime les résultats, je lance simplement les *,vfichiers ou tout le répertoire RCS. N'exécutez pas git clean -fdxou similaire jusqu'à ce que vous ayez engagé votre travail dans votre "vrai" SCM, ou vous le regretterez.

  4. Cachettes nommées.

    Un autre Git-ism, mais pratique: git stash save --include-untracked <some-cool-title>peut être utile à la rigueur. Vous pouvez enregistrer, faire apparaître et appliquer les travaux en cours de cette manière, et afficher vos différents points de contrôle via git stash listou git reflog --all. D'autres SCM peuvent avoir des fonctionnalités similaires, mais votre kilométrage peut varier considérablement avec celui-ci.

CodeGnome
la source
0

Une partie de ce code temporaire n'est vraiment qu'une manifestation d'une méthodologie de construction / test / développement incorrecte, et j'espère que leur existence motivera une amélioration future.

Sur git au moins, vous devriez être libre de jouer avec n'importe quel nombre de branches de fonctionnalités jusqu'à ce qu'elles soient prêtes à être fusionnées dans master / trunk.

Le contrôle de version est censé vous aider , et le plus souvent j'apprécie les informations tirées de la façon dont des erreurs (ou peut-être simplement des décisions moins qu'intuitives) ont été faites dans le passé, et prennent des décisions plus éclairées pour le moment.

prusswan
la source
0

Je crois que certains systèmes lanceront des avertissements en voyant TODO dans un commentaire, donc

// TODO: remove this hack.

pourrait être tout ce qui est nécessaire si vous pouvez trouver une option pertinente dans une partie de votre environnement de développement, ou simplement coller une sorte de commande grep dans votre fichier de build. Il peut également être possible d'organiser // HACKou de récupérer n'importe quelle chaîne arbitraire.

C'est plus simple que d'organiser votre code d'une manière particulière et d'espérer que les gens se souviendront de ne pas l'utiliser. Il est également plus sûr de suivre les conseils de @gbjbaanb (si vous pouvez vous assurer que tout le monde voit les avertissements!).

Collez tout ce que vous aimez là-dedans parce qu'un jour vous voudrez peut-être voir ce que c'était, et ce sont les jours où vous réalisez ce qu'est vraiment votre SCM.

GKFX
la source
0

Il n'est jamais dangereux de mettre du code dans le contrôle de code source.

Chacun des éléments que vous mentionnez doit être sous contrôle de source.

Toby Allen
la source