2011-07-28 3 views
2

Tout d'abord, je m'excuse car je suis nouveau sur git, ssh et Xcode. Aussi, je suis plutôt un phobique de la ligne de commande.Xcode 4 git: projet git local 'moving' sur notre serveur distant

Nous avons un serveur en cours d'exécution où les clients se connectent avec l'authentification SSH/pousser le code de/vers. Il fonctionne magnifiquement à partir de Xcode 4 pour les projets existants que j'avais configurés en utilisant la ligne de commande git. C'est très simple de cloner des projets à partir de là en utilisant Xcode 4 et en appuyant sur commits.

Ce que je suis confus au sujet est comment configurer notre serveur comme origine/maître pour les projets locaux git que les développeurs ont créé avec Xcode 4 (avec beaucoup d'histoire checkin). Je vois qu'il ya un dossier caché .git, alors j'ai essayé:

scp -r .git [email protected]: MyProject.git

Puis de Xcode 4, je peux aller de l'avant et cloner de notre serveur parfaitement. Je peux voir l'historique complet des vérifications. Si j'essaie de pousser les changements, je reçois un énorme message d'erreur.

distance: Erreur: refus de mise à jour vérifié sur la branche: refs/heads/maître
à distance: Erreur: Par défaut, la mise à jour de la branche courante dans un référentiel non-nu
à distance: erreur: est refusée, car elle rendra l'index et l'arbre de travail incohérents
remote: erreur: avec ce que vous avez poussé, et nécessitera 'git reset --hard' pour correspondre à
remote: erreur: l'arbre de travail à HEAD.
distance: Erreur: Vous pouvez définir la variable de configuration « receive.denyCurrentBranch » à
à distance: erreur: « ignorer » ou « mettre en garde » dans le dépôt à distance pour permettre de pousser dans
à distance: erreur: sa branche actuelle; Cependant, ce n'est pas recommandée à moins que vous
à distance: erreur: conçu pour mettre à jour son arbre de travail pour correspondre à ce que vous avez poussé dans une
à distance: erreur: autre manière. Erreur:




remote: erreur: pour supprimer ce message et conserver le comportement par défaut, définissez
remote: erreur: la variable de configuration 'receive.denyCurrentBranch' est 'refusée'. [snip]

Je ne sais pas comment procéder correctement sans perdre l'historique précieux de checkin que les développeurs ont déjà sur leurs machines locales. Est-ce que quelqu'un peut souligner l'étape ou le concept fondamental qui me manque?

Merci!

Répondre

9

Si vous voulez push à un dépôt, il est interdit par défaut à push à une branche qui est actuellement extraite. Pour éviter cela, les dépôts centraux (ceux sur lesquels tout le monde pousse) sont généralement créés sous la forme de repos bare, c'est-à-dire qu'ils contiennent uniquement les informations de version et aucune copie de travail extraite. Ces repos sont par convention nommés <repo-name>.git. Vous pouvez créer un repo nu en utilisant le drapeau --bare sur git init

git init --bare myrepo.git 

Mais le problème est que vous avez copié un dossier .git local my.server.com au lieu de créer un repo il nu.Dans .git/config, il y a l'information si le repo est nu ou non. Dans les copies de travail, bare est faux, cette information est maintenant sur le serveur.

La bonne façon de contourner ce serait

  1. créer un repo nu sur le serveur (comme écrit ci-dessus)
  2. ajouter cette prise en pension comme remote dans votre copie de travail
    git remoteadd origin [email protected]:MyProject.git
  3. pousser le contenu de votre repo local origin
    git push--force --all origin
+1

Merci beaucoup. Vous avez réussi. –

Questions connexes