Git: Sans serveur
Git est censé être un système décentralisé, mais tous les tutoriels et les meilleures pratiques que j'ai trouvées sur google suggèrent d'utiliser un serveur (généralement github, ou bien mettre en place votre propre)
J'utilise git pour de petits projets personnels (2-3 personnes), où puis-je trouver un workflow de meilleure pratique pour la synchronisation des modifications directement entre les machines des membres de l'équipe. Alternativement, quels sont des arguments convaincants pour pourquoi je devrais éviter cela et plutôt mettre en place un "central" le serveur?
Merci,
Ben
7 réponses
Dépend de ce que vous entendez par "serveur". Git fonctionnera heureusement sans serveur central, bien que de nombreuses équipes trouvent pratique d'avoir un référentiel central.
Si par "serveur", vous voulez dire "installer le logiciel serveur", git fonctionnera également (dépôt central ou non) sans logiciel spécial, via ssh ou sur le système de fichiers.
Voir ce document pour les flux de travail possibles
Flux de travail avec référentiel commun
Le flux de travail que beaucoup utilisent est que tout les développeurs "poussent" (envoient) leurs modifications dans un référentiel commun, et obtiennent toutes les modifications de ce référentiel. Quelque chose comme ceci:
- développeur a pousse à central
- développeur B pousse à central
- Développeur C tire (obtenir des modifications de A et B)
- le développeur a tire (obtenir des modifications à partir de B)
- ...
Dans ce cas, le référentiel central peut être sur l'un des ordinateurs des développeurs, sur github ou tout autre lieu
Flux de travail avec E-Mail
Vous pouvez également utiliser git sans serveur, simplement en utilisant le courrier électronique. Dans ce cas, le flux serait comme ceci:
- le développeur A envoie les modifications sous forme d'e-mail à l'équipe
- D'autres développeurs appliquent les modifications des e-mails
Cela peut même être fait de manière semi-automatisée
Flux de travail sans serveur central
Vous pouvez configurer git pour utiliser plus d'un référentiel" distant". La mise en garde est que vous devriez jamais pousser vers un référentiel qui est extrait (c'est-à-dire une copie de développeur sur laquelle quelqu'un travaille). Dans ce cas, le flux serait comme ceci:
- le développeur a apporte des modifications
- le développeur B apporte des modifications
- Le Développeur C tire les modifications d'un
- Le Développeur C tire les modifications de B
- le développeur B tire les modifications de A
- ...
- personne ne doit jamais pousser
IMHO ce type de flux de travail va rapidement conduire à la confusion et la ventilation.
Ce que vous devez faire en premier, c'est de réfléchir au type de flux de travail que vous avez déjà et de configurer git pour qu'il fonctionne avec. Une fois que vous avez quelque chose en cours d'exécution, vous pouvez affiner. Il n'est pas nécessaire de configurer un ordinateur séparé en tant que serveur. Si vous êtes habitué à avoir un référentiel central, tout ce que vous devez faire est de créer un référentiel nu auquel tout le monde pousse. Pourquoi pas sur le réseau local?
Centrale repo:
mkdir foo.git
cd foo.git
git init --bare
Votre dépôt:
mkdir foo
cd foo
git init
// add files
git add .
git commit -m "Initial commit"
git remote add origin //path/to/central/repo/foo.git
git push origin master
Autres repos:
git clone //path/to/central/repo/foo.git
Maintenant, tout le monde peut pousser et tirer directement de la branche principale. Cela devrait être assez pour vous obtenir a commencé.
Vous n'avez pas nécessairement besoin de mettre une copie sur un serveur physique quelque part, mais cela peut aider à avoir un référentiel "béni" quelque part-rendre un membre de votre équipe (éventuellement en rotation) responsable de la collecte et de la gestion des modifications des personnes lorsqu'elles sont prêtes à être traitées comme finales. Ils peuvent conserver une branche dans leur référentiel habituel ou maintenir un référentiel séparé sur leur système local pour stocker les sources principales.
Comme exemple concret, considérons Linux et Linus Torvalds -- il n'y a pas de référentiel central auquel tout le monde pousse, mais Linus maintient un référentiel qui contient tout le code qu'il considère comme "prêt" (et plusieurs autres personnes, pour différentes définitions de "prêt"). De cette façon, vous avez une définition canonique de ce que le code est, et un endroit pour définir ce que sont vos versions.
Vous devez configurer un serveur central comme une construction sociale, pas technique, afin que tout le monde sache où trouver la dernière version officielle, sans aucune possibilité de confusion.
Comme cela a été mentionné, Git fonctionne très bien sans serveur centralisé. Mais une bonne raison d'avoir un serveur central est d'avoir une place pour code une fois qu'une fonction est complété par d'autres développeurs peuvent tirer de sans avoir à accéder à votre machine locale.
Par exemple, actuellement je travaille sur une équipe de développement de 3 hommes. Nous travaillons tous sur des ordinateurs portables. Nous pourrions avoir un flux de travail où nous tirons juste des machines de l'autre. Mais si je travaille sur une fonctionnalité et engage mes chances après que tout le monde a quitté le bureau et je veux qu'ils jettent un oeil avec ce système, ils ne peuvent rien faire à moins que mon ordinateur portable est allumé et disponible sur le réseau. Si les gars se présentent plus tôt que moi (ce qu'ils font toujours), ils doivent attendre que mon ordinateur portable soit de retour en ligne.
Si je pousse à quelque chose comme BitBucket ou GitHub ou juste un serveur toujours sur le bureau, l'un des autres développeurs peut simplement tirer les changements que j'ai faits quand ils sont en ligne.
C'est pour moi le raison principale d'avoir un serveur central, et ce n'est vraiment pas une faute avec Git mais plutôt une conséquence de travailler avec des ordinateurs portables.
Jetez un oeil au Git pour les débutants: le guide pratique définitif
Section " comment configurer un référentiel d'équipe partagé?"
Git fonctionne assez bien avec ce type de configuration, bien que vous souhaitiez éviter de pousser les modifications vers la branche extraite de quelqu'un d'autre ( https://git.wiki.kernel.org/index.php/GitFaq#Why_won.27t_I_see_changes_in_the_remote_repo_after_.22git_push.22.3F ). Vous pouvez avoir une branche d'intégration vers laquelle vous poussez du code et fusionnez les modifications d'autres personnes.
Je pense que la principale raison pour laquelle un repo central est beaucoup utilisé est qu'il peut être pris comme base canonique pour tous vos code, alors qu'il peut être un peu plus difficile de raisonner sur ce que vous devriez fusionner lorsque vous avez 3 branches ou plus de développement en cours.