Contexte: J'ai récemment hérité d'un ensemble de projets dans mon entreprise et j'essaie de régler certains problèmes fondamentaux avec la façon dont ils ont été traités. À savoir, les développeurs précédents (qui ne font plus partie de la société) n'utilisaient aucune forme de contrôle de source, faisaient peu de documentation et n'avaient pas vraiment de bons processus de développement en place.
Alors maintenant, j'ai trois serveurs pour des projets (développement, mise en scène, production) qui consistent principalement en des sites Web et des applications et des outils conçus pour les applications tierces et les API que nous utilisons, jusqu'aux magasins de scripts SQL et autres. Ma première pensée a été d'intégrer tout cela dans Git avant que des modifications et des correctifs ne soient apportés, mais j'ai du mal à trouver la meilleure façon de le faire.
De nombreux développements antérieurs ont été effectués directement sur les serveurs de production, ce qui a créé un fossé entre la base de code de chaque serveur. On ne sait pas immédiatement où se situent toutes les différences - je vois des corrections de bogues du côté de la production qui ne sont pas reportées sur le développement / la mise en scène, ainsi que de nouvelles fonctionnalités sur le développement qui n'ont pas été déplacées vers la mise en scène / la production .
Question: Quelle serait la meilleure façon pour moi de les organiser et de les déplacer dans Git? Comment est-ce que je structurerais mes repos / branches pour tenir compte des différences dans le code?
J'ai envisagé de poursuivre le développement à partir de clones du code du serveur de production et de conserver les bases de code de développement / de transfert comme référence historique. Serait-ce potentiellement un point de départ, étant donné que je ne sais rien du code dev / staging de toute façon? Je pouvais simplement créer des dépôts des serveurs de production pour chaque site Web, outil, jeu de scripts, etc., créer des branches pour le code de développement / de transfert existant, et tout nouveau développement se dériverait à partir de la base de code du serveur de production. Est-ce que ça a du sens?
Réponses:
Poussez les trucs de production dans la
master
branche d'un nouveau repo. Créez unedevelop
branche à partir de cela, puis fusionnez-y le serveur de transfert. Vous pouvez vous retrouver avec des conflits qui doivent être résolus. Une fois que ceux -ci sont résolus, créer un autre àfeature_branch
partirdevelop
et fusionner le serveur de développement en elle. Résolvez tous les conflits qui surviennent.Cela vous laisse 3 branches, qui représentent vos environnements de production, de mise en scène et de développement. Production ->
master
, mise en scène ->develop
, développement ->feature_branch
. Tout développement est donc effectué surfeature_branches
et n'est fusionné dans ladevelop
branche que lorsque la fonctionnalité est terminée, testée et stable. Puisqu'il est stable, il peut être utilisé comme mise en scène. Coupez unerelease
branche à partir dudevelop
moment où vous êtes prêt à publier, attachez toutes les extrémités libres, fusionnez-lesmaster
, puis vous avez votre nouvelle version de production.L'une de vos premières commandes après avoir configuré cette configuration devrait être de fusionner le
feature_branch
back indevelop
*, puis de le faire àdevelop
nouveaumaster
. Gardez à l'esprit que lefeature_branch
peut contenir du code et des fonctionnalités non testés, alors soyez prudent lorsque vous le fusionnezdevelop
et ensuitemaster
. Une fois cela fait, toutes les branches doivent contenir le même code, et tout développement qui a été fait sur le serveur de production est maintenant redirigé vers le "serveur" de développement.Dans ce modèle, chaque projet serait dans son propre référentiel, et ce référentiel aurait une branche
master
etdevelop
, plusfeature_branches
pour tout travail effectué.EDIT, pour répondre aux commentaires: Oui, c'est Gitflow.
Cette stratégie (ou Gitflow en général) maintient le système existant à 3 niveaux (production, mise en scène, développement) avec un chemin de fusion clair depuis le développement jusqu'à la production. L'importation des bases de code de cette manière permet également de synchroniser les branches tout en maintenant le statu quo en production - au moins, jusqu'à ce que les fusions puissent être testées. Cela atteint quelques objectifs: obtient le code dans le contrôle de code source, synchronise et fusionne les différentes bases de code (donc il n'y a plus de corrections de bogues en production mais pas en développement), et fournit un processus agréable à utiliser à l'avenir (un processus bien défini et utilisé par de nombreuses personnes / équipes / entreprises). Si l'OP trouve que Gitflow n'est pas bien adapté à ses projets / équipes / entreprise tel qu'il l'utilise / l'entreprise grandit, alors c'est '
* Vous souhaiterez peut-être couper une autre branche de fonctionnalité et supprimer toutes les nouvelles fonctionnalités évidentes, et fusionner cette branche dans
develop
(puis dansmaster
). Cela vous évite d'avoir à tester de nouvelles fonctionnalités en plus de tous les autres tests que vous effectuerez.la source
Je vais recommander le
staging
code comme meilleure référence pour votre importation initiale. En effet, il y a des changementsproduction
qui ne sont pas dansstaging
, en raison des correctifs, mais beaucoup moins, s'il y en a,staging
qui ne le sont pasproduction
. De même, il y a des changementsdevelopment
qui ne sont pas inclusstaging
, en raison des nouvelles fonctionnalités, mais probablement beaucoup moins, voire aucun,staging
qui ne le sont pasdevelopment
.Notez que vous ne pas voulez
staging
être votre base après votre importation initiale. Il s'agit simplement d'une situation temporaire en raison de modifications qui n'avaient pas été suivies auparavant. Les opérations de succursale se déroulent beaucoup plus facilement si vous ajoutez des modifications plutôt que de les supprimer. Après votre importation initiale, passez au modèle de branchement qui convient le mieux à vos besoins à l'avenir.Donc, vérifiez votre
staging
code dans unestaging
branche, puis faites ungit checkout -b master staging
pour créer votremaster
branche et archivez votre code de production là-dedans. Ensuite, faites ungit checkout -b development staging
pour créer votredevelopment
branche et vérifiez votre code de développement là-dedans.Maintenant , vérifier votre
development
branche et de fusionmaster
en elle. Cela vous permettra de résoudre l'énorme quantité probable de conflits de fusion tout en conservantmaster
un enregistrement de ce qui est réellement en production.development
contient maintenant tous les changements de chaque environnement. Vous pouvez désormais basculer vers le modèle de branchement qui vous convient le mieux.la source
C'est une bonne idée d'avoir l'histoire. Je créerais le référentiel (ou un pour chaque produit) à partir de l'environnement le plus stable. Créez des branches ou des différences pour les autres.
À un haut niveau:
XYZ
Archive-XYZ
XYZ
source (sauf .git)Alternativement, si vous êtes sceptique quant à la valeur de ceci,
git diff > XYZ.diff
au lieu de réellement commettre et pousser, et archiver les différences.Dans les deux cas, vous devez vous retrouver dans un état où vous pouvez facilement comparer le code que vous avez exécuté dans chaque environnement, que vous pouvez utiliser pour définir un point de départ unique pour chaque projet. Et, si quelque chose se casse, vous pourrez théoriquement comparer vos modifications avec l'un des trois environnements.
la source