J'ai configuré git pour mon propre usage - afin que je puisse accéder à un projet de `` n'importe où '', et garder la sécurité de la version s'il se trouve que je travaille sur la partie X ici et la partie Y ici, et peut fusionner si nécessaire.
Cependant, une seule de mes machines de développement a une adresse IP statique. Mon cerveau est bloqué en mode CVS, j'ai donc essayé de configurer git pour que cette machine soit le serveur «central», dont tous les autres tirent.
Ce genre de travaux. J'ai un tas de machines AC qui font un git-pull du 'master' M. Ils font des git push pour renvoyer les données.
Le problème vient si je fais du développement sur le maître. Tout d'abord, je ne peux pas comprendre comment obtenir le référentiel central pour fournir la dernière version sans faire
git reset --hard HEAD
ce qui semble un peu excessif. Et si je fais du développement sur la machine centrale avant de réinitialiser, je ne sais pas comment le fusionner avec des changements qui ont déjà été poussés.
Quelque chose au sujet de mon modèle mental est loin. Aidez-moi?
Réponses:
Vous souhaitez que votre référentiel central soit nu. Supposons que la machine sur laquelle elle vit s'appelle
static
:Ce référentiel nu est un point de rendez-vous central: il sert à pousser et à tirer, pas à développer.
Faites votre développement sur les clones du référentiel central:
Même si vous êtes sur
static
, travaillez en clone:Bien que vous soyez le seul à travailler sur ce référentiel, prenez l'habitude de faire votre travail sur ce que la documentation de git appelle les branches de rubrique . Un avantage immédiat de ceci est qu'il garde un maître propre , c'est-à-dire que vous pouvez toujours tirer de votre branche principale centrale dans le maître de votre référentiel local actuel sans fusion.
Par exemple:
Cela peut ne pas sembler être un gros problème, mais cela vous donne la liberté de laisser le projet tel que représenté sur cette branche dans un état partiellement cuit, ou si votre idée cool se révèle être un flop, vous pouvez facilement jeter cette branche sans casser quoi que ce soit d'autre dans votre projet qui travaille déjà sur d'autres branches. Des mulligans gratuits à l'infini!
Peut-être que vous rentrez chez vous ce soir-là et ajouté une nouvelle fonctionnalité. Le lendemain matin, vous
pour mettre à jour votre maître local pour refléter ce qui se trouve dans le référentiel central.
Mais maintenant, dites que vous avez corrigé le bogue foo et êtes prêt à l'inclure dans votre branche principale. Vous voulez d'abord l'intégrer aux changements de la nuit dernière:
La
rebase
commande donne à votre référentiel l'impression que vous avez corrigé le bogue foo en plus de la nouvelle fonctionnalité de la nuit dernière. (C'est un peu commesvn update
, mais plus flexible et puissant.)Maintenant, pour l'obtenir dans votre maître central:
Nous traitons le maître comme spécial, mais ce n'est que conventionnel. Vous pouvez partager le travail sur différentes branches de différents référentiels via le référentiel git
static
tout aussi facilement.la source
git init --bare
sans aucun autre argument. Il utilisera le répertoire de travail actuel ou le paramètre d'environnement GIT_DIR s'il est défini. Je crois que vous avez besoin de git 1.6.5.x pour qu'il prenne un argument de répertoire.Si vous avez un serveur central avec un référentiel git central, ce référentiel doit être un
bare
référentiel. Les référentiels nus ne contiennent pas de copies de travail des fichiers. Par conséquent, si vous travaillez sur cette machine centrale, vous ne travaillez pas directement avec le référentiel central, mais avec un clone local.la source
Cette réponse est similaire à la réponse de gbacon , mais adopte une approche selon laquelle vous avez déjà une configuration de référentiel local et que vous souhaitez créer un maître distant qui est traité comme un référentiel central. Il s'agit simplement d'ajouter des détails d'une approche différente.
J'utilise git pour stocker mes fichiers dot-config. Je pousse et tire de ce que je considère comme un «repo central». Il est très pratique de réinitialiser tous mes fichiers dot via plusieurs ordinateurs.
Cela a créé un dépôt nu vide sur le site de dépôt.
Maintenant, si j'ai déjà un dépôt local, je peux le pousser vers le site distant.
chdir dans le répertoire local.
Ajoutez le référentiel distant comme origine, afin que push / pull agisse sur ce référentiel.
Poussez mon maître à l'origine (comme précédemment étiqueté via la télécommande git). Maintenant que le dépôt à distance est traité comme mon «dépôt central». Tous mes git push / pull interagiront avec l'origine.
Si je vais sur un autre hôte, je peux facilement tirer via un clone ce dépôt vers un nouvel emplacement.
Si je veux faire du développement sur le serveur distant, je clone d'abord, puis repousse / tire dans le référentiel nu.
Vous devrez probablement régler votre
git config --add branch.master.remote origin
doncgit pull
ne vous plaignez pas que vous n'êtes pas assez précis. L'autre alternative consiste à définir votre branche principale sur--track
l'origine distante. Utile si vous avez plusieurs succursales.la source
Je faisais juste des recherches sur ce même problème aujourd'hui. Ce blog post a beaucoup de discussions sur la question, mais l'opinion majoritaire est de faire ce que dit Manni. Regardez un commentaire sur le post de David French pour d'autres possibilités, y compris ce qu'il faut faire si vous finissez par pousser par erreur vers un référentiel qui a du travail non engagé dans l'index ou l'arborescence de travail. "git reset –soft HEAD ^" annulera le changement poussé sans perturber votre travail.
la source