2010-05-04 9 views
2

Voici ma configuration ...GIT Clones sur plusieurs machines

ordinateur portable (Mac) - clone git du dépôt svn

d'entraînement de pouce - clone git de dépôt git portable

Server (Windows Server 08) - git clone du référentiel clé USB

Je ne parviens pas à les maintenir synchronisés pour une raison quelconque ...

Si je fais un changement sur le serveur, je ferai un "git pull" sur la clé USB pour obtenir les changements. Prenez la clé USB à l'ordinateur portable et faites "git pull" sur l'ordinateur portable. De là, je peux faire "git svn dcommit" et tout va jusqu'au dépôt SVN sans problème. Si je tire des changements de SVN avec "git svn rebase", puis faire un pull sur la clé USB et faire un "git status" il est dit que je suis ## révisions devant le maître/origine et je peux ne comprend pas pourquoi.

serveur

>git remote show 
origin 

>git remote show origin 
* remote origin 
    Fetch URL: E:/proj 
    Push URL: E:/proj 
    HEAD branch: master 
    Remote branch: 
    master tracked 
    Local ref configured for 'git push': 
    master pushes to master (local out of date) 

ordinateur portable

>git remote show 
(nothing) 

>git remote show origin 
fatal: 'origin' does not appear to be a git repository 
fatal: The remote end hung up unexpectedly 

Pouce-drive

>git remote show 
origin 

>git remote show origin 
* remote origin 
    Fetch URL: /Users/me/ui/proj 
    Push URL: /Users/me/ui/proj 
    HEAD branch: (unknown) 
    Remote branch: 
    master tracked 
    Local branch configured for 'git pull': 
    master merges with remote master 
    Local ref configured for 'git push': 
    master pushes to master (up to date) 
+0

Pourriez-vous éventuellement ajouter la sortie de 'git remote show', et plus précisément' git remote show origin'? Cela pourrait rendre un peu plus facile de savoir exactement comment fonctionne votre installation. Merci! (oh, pour chaque repo bien sûr, oublié que. :-D) –

+0

Ajout d'informations ci-dessus ... – Adam

+0

Lesquels sont des dépôts créés avec git-svn, et qui sont des clones de ceux-ci? –

Répondre

5

Les commandes Git comme pull ne fonctionnent pas vraiment avec les rebasages. Disons que sur votre ordinateur portable, vous avez des validations qui ne sont pas encore dans svn, et la clé USB est synchrone. Quelque chose comme ceci:

laptop: 
svn1 -- svn2 -- A -- B -- C -- D 

thumb drive: 
svn1 -- svn2 -- A -- B -- C -- D 

Ensuite, vous ne git svn rebase pour obtenir de nouvelles choses de svn. Cela fonctionne en deux étapes:

Maintenant, nous devons mettre votre travail git sur de nouveaux svn engage, donc nous avons encore l'histoire non ramifiée. Ceci est la partie de rebasage:

laptop (after git svn rebase) 
svn1 -- svn2 -- svn3 -- svn4 -- A' -- B' -- C' -- D' 

Maintenant, s'il n'y a pas de conflit, commettras A » contient les mêmes modifications que vieux engagent A, la seule chose différente est son ancêtre: svn4 au lieu de svn2. Puisque l'histoire est une partie de chaque engagement, car git A et A 'sont des commits différents.

Donc une fois que vous faites git pull de repo ordinateur portable à la prise en pension de clé USB, git fait ce qui est naturel, ce qui est de fusionner les nouvelles modifications:

thumb drive (after git pull) 
svn1 -- svn2 -- svn3 -- svn4 -- A' -- B' -- C' -- D' 
      \           \ 
      + A -- B -- C -- D -------------------- merged result 

Cela prend tout son sens dans git, car il permet pour suivre tous les changements dans un environnement non linéaire, et notez qui a fait les fusions et comment. Cependant, vous ne serez pas en mesure de commettre ce genre d'histoire à svn.

Si vous forcez-poussé les modifications apportées à votre pension de pouce, vous finiriez avec quelque chose comme ceci:

thumb drive (after forced push) 
svn1 -- svn2 -- svn3 -- svn4 -- A' -- B' -- C' -- D' 

qui est tout à fait bien si vous ne l'avez pas fait des changements sur repo d'entraînement de pouce. Si vous le faisiez, cela les écraserait. Pour garder les changements de pouce-lecteur, vous devez faire un git rebase plus là.

Je dirais que pour utiliser pleinement le confort de git, vous devez renoncer à la possibilité de confier votre travail à svn. Il n'y a pas de moyen facile d'avoir un contrôle de version distribué et des historiques linéaires en même temps.

+0

Voilà beaucoup de très bonnes infos! Donc, aucun changement n'est jamais fait directement sur la clé USB. Il est seulement utilisé comme intermédiaire entre le serveur et l'ordinateur portable. Nous avons seulement besoin de le faire de temps en temps puisque nous ne déployons que de temps en temps sur le serveur. Existe-t-il un moyen de faire ce travail? Nous voulons être en mesure de conserver l'historique des modifications du serveur (lors de l'intégration), puis être en mesure de mettre rapidement à jour le serveur au plus tard. – Adam

+0

Très bonne illustration de ce que je pensais exactement. – dlamotte

+0

@Adam: Si vous faites tout cela pour déployer sur le serveur, la meilleure chose serait IMO pour mettre l'option 'remote. (Name) .fetch' sur la clé USB juste pour refléter le repo portable (je pense que le paramètre est' + refs/heads/*: refs/heads/* ') et faites de même sur le serveur avec clé USB. Tout ce que vous avez à faire est alors de lancer 'git fetch (laptop)' sur le repo du lecteur de disquette, et 'git fetch (du pouce) && git checkout -f (mon_chosen_branch)' sur le serveur. (Notez que cela écrase toutes les modifications locales sur le pouce et le repo du serveur.) – che

0

C'est parce que le code git svn rebase rebases des commits dans le référentiel. Si des commit git vous avez fait havent été engagé dans le repo en amont, l'identifiant de validation va changer et vos autres dépôts n'auront pas encore vu ce changement. C'est ma meilleure estimation en ce moment. Votre flux de travail est un peu confus pour moi. Un diagramme ascii peut aider un peu, mais ce serait un peu de travail;)

À mon avis, la meilleure façon de faire peut-être à git push -f ... à votre lecteur de pouce après chaque git svn rebase. Fondamentalement, mettre à jour de force la clé USB. Mais pour être honnête, je ne suis pas vraiment un gourou.

+0

Cela a du sens ... comment puis-je empêcher/réparer cela? – Adam

+1

Malheureusement, voir la section CAVEATS dans la page de manuel git-svn. Cloner, pousser et tirer avec un dépôt git-svn n'est pas recommandé. J'ai une question en suspens sur ce qui doit être fait soit à Subversion, git, ou à d'autres DVCS afin qu'ils soient vraiment interopérables. –

Questions connexes