2009-03-04 5 views
2

Je suis relativement nouveau à Git, mais je veux essayer (vs SVN et Bazaar).Comment puis-je utiliser deux projets SVN et les branches git-svn correspondantes avec un seul répertoire de travail?

Quelqu'un peut-il me recommander un flux de travail pour une situation similaire à ce qui suit:

  • 1 repo SVN, avec plusieurs projets
  • 1 copie de travail "src"

Le ideea est que dans "src" j'ai besoin de vérifier le projet A ou parfois le projet B. Les deux projets ont plusieurs branches.

Pour l'instant, j'ai fait 2 clones git du repo SVN, un pour chaque projet. (J'aurais préféré repo --bare, mais il ne fonctionne pas avec git svn clone)

Ensuite, je fait une git dans "src", et git remote add projA ..a_repo_git, "git remote add projB ..b_repo_git".

Maintenant, je peux voir tous les deux de "src" en utilisant "à distance git", et je peux voir leurs branches avec "PROJA show à distance git"

Et maintenant la peine ..

  • Comment puis-je obtenir dans "src" l'une des branches de projA/projB?
  • Comment puis-je les modifier, puis pouvoir les repousser (d'abord vers les git_repos, ou directement vers le repo SVN)?
  • Ce "workflow" est-il correct, ou avez-vous une meilleure idée?

J'ai essayé dans src: git checkout --track -b work_branch projA branch_in_A et après quelques fiddleing avec « chercher » j'ai réussi à obtenir les choses. Mais ensuite, j'ai eu des problèmes pour le renvoyer au a_repo_git, puis au SVN. C'était surtout un essai et une erreur.

Je dois admettre que j'ai encore des problèmes avec les succursales distantes! (Et je me perds quand je dois utiliser « origin local_branch:origin_branch » ou « origin origin_branch:local_branch » ou « origin origin_branch » ou « origin/origin_branch »! Retour au manuel Git pour une lecture plus.)

+0

Quelle est votre raison pour les clones git-svn du dépôt svn? Pourquoi ne clones-tu pas les dépôts de travail? – hillu

+0

J'ai essayé, mais j'ai eu quelques problèmes. Je l'ai essayé encore une fois, apparemment je me rapproche - mais il y a un peu trop de branches maintenant. (les deux projets, A et B utilisent la mise en page standard svn, trunk + branches + tags, et j'ai dû faire quelques modifications dans le fichier config) – Alex

Répondre

3

Je ne l'ai pas mis à jour la question, parce que, dans les derniers jours, j'ai pu travailler vraiment agréable et facile avec l'aide de mon nouveau repo :)

Voici ce que je l'ai fait à la fin:

Init deux dépôts SVN dans le même répertoire. (Je ne peux pas Rember à ce moment, mais il peut être possible qu'un « git init » a été fait dans le même répertoire, avant:

 
mkdir src && cd src 
(not sure about this: git init) 
git svn init --stdlayout --prefix=projA/ -RprojA file:///path/to/svn/repo/A 
git svn init --stdlayout --prefix=projB/ -RprojB file:///path/to/svn/repo/B 

Le « --stdlayout » signifie que les prises en pension SVN sont en le format standard, avec le tronc, les branches et les balises au même niveau

Le préfixe "--prefix" est utilisé pour le nom des branches Lorsque nous faisons "git branch -a", toutes les branches SVN du projet A ont le Le préfixe "projA" (ex: projA/nom_branche_de_A) .La même chose est pour B.

L'option -R définit le nom du repo SVN, à l'intérieur du repo git (c'est le nom que nous utilisons avec git lorsque nous référons dans le répertoire SVN/projet)

Le fichier: /// path est le chemin vers le repo SVN et vers le projet dans le repo, dans ce cas. J'utilise "file: //" parce que j'ai utilisé un repo à plat, sans serveur. Je suis sûr que ça marche bien avec http: // aussi, pour un serveur SVN. Après cette étape, par curiosité, j'ai regardé le fichier src/.git/config. Les deux commandes ci-dessus ont créé plusieurs sections "svn-remote", une pour chaque projet (l'option -R), et une générique appelée "svn". J'ai modifié les entrées, donc il n'y aura que des références aux projets. Chaque référence avait des entrées pour le chemin repo (fetch) et pour les tags/branches/trunk. Si vous regardez le fichier, vous comprendrez ce qui doit être changé.

Après cela, je l'ai tiré par les cheveux le contenu de chaque projet, en utilisant

 
git svn fetch projA #the contents of project A repo are downloaded 
git svn fetch projB #the contents of project B repo are downloaded 

Maintenant, runnig « branche git -a » affiche toutes les branches des deux prises en pension, et la branche principale (locale). "git branch -r" n'a affiché aucune branche; probablement parce qu'ils sont "svn-remote" et non "remote"

La branche "principale" actuelle pointait sur le tronc du second projet. J'ai décidé de m'en débarrasser, car cela causerait des problèmes lors du passage d'un projet à l'autre.

J'ai créé deux nouvelles branches pour pointer vers les troncs de chaque projet, puis retiré le « maître » Branche:

 
git checkout -b master_project_A projA/trunk 
git checkout -b master_project_B projB/trunk 
git branch -D master 

Et maintenant, pour le « flux de travail »; de travailler sur le projet A:

 
git checkout master_project_A #switch to project A 
git svn rebase #check for any updates on SVN repo 
git checkout -b work_on_A master_project_A #create a branch starting from the master of project A 

work work work on work_on_A; commit, etc 

git checkout master_project_A #go back to master of project A 
git svn rebase #check again for any update on SVN repo 
git checkout work_on_A #go back to the work branch 
git rebase master_project_A #update branch with any changes from the master of project A 
git checkout master_project_A #go back to the master of project A 
git merge work_on_A #merge to the master of project A the changes from the work branch 
git svn dcommit #commit changes to the SVN repo, in trunk, because master_project_A was pointing to its trunk 

Si je veux la caisse une branche existante du SVN, je peux le faire avec:

 
git checkout -b work_on_branch projA/branch_name 

work work work 

git svn rebase #update any changes from projA/branch_name 
git svn dcommit #commit updates back to the branch in the SVN repo 

Pour le projet B je peux faire exactement les mêmes choses. A la fin, je peux avoir le contenu du projet A ou B dans le même répertoire "src", et avoir accès aux deux projets sur le dépôt SVN à partir du même repo git! : D

Je n'ai toujours pas compris comment créer une branche locale, puis le pousser vers le repo SVN - j'étais proche, mais cela n'a pas fonctionné.

En outre, il peut être utile de connaître la commande "reset" ("git reset --hard projPrefix/branch") mais j'ai cassé quelques choses en l'utilisant, il vaut donc peut-être mieux laisser ça à un autre moment .

J'espère que cela aide quelqu'un!

Cheers, Alex

2

Considérons d'abord le cas simple de un dépôt à distance et un dépôt local.

Un remote dans le repo local fonctionne "seulement" comme une référence à l'autre repo. Vous pouvez utiliser fetch pour récupérer les objets à distance à votre magasin:

git remote add upstream git://... 
git fetch upstream 

Maintenant, toutes les branches de upstream peuvent être référencées localement et a travaillé sur l'aide upstream/branchname. Pour vraiment sur une branche à distance, vous devez toujours faire une branche locale qui suit la branche à distance:

git checkout -b new_local_branchname upstream/branchname 

Maintenant, vous pouvez travailler localement et engager/fusionner autant que vous le souhaitez. En dernier lieu, vous pouvez push revenir dans le référentiel central. Le bit important est que AFAIK push ne peut faire que des fusions rapides, c'est-à-dire télécharger les changements et définir la nouvelle tête. Vous devez donc préparer votre branche locale pour que les modifications locales commencent à l'extrémité de la branche distante.Vous pouvez utiliser rebase pour y parvenir ou éviter de modifier le référentiel central pendant que vous travaillez localement.

Ceci décrit le flux de travail simple entre deux référentiels. Maintenant au cas spécifique avec SVN.

git svn complique l'image en limitant davantage le genre de changements que vous pouvez faire. Comme avec les télécommandes, vous ne devriez jamais modifier directement les branches svn mais toujours travailler sur une branche locale. Contrairement aux télécommandes, git svn modifie toujours les validations lorsqu'elles entrent dans le dépôt SVN pour ajouter les métadonnées nécessaires. Ce dernier fait est probablement la raison de beaucoup de vos problèmes car les validations sur la branche SVN auront toujours des hashs différents des commits originaux sur vos branches locales.

Enfin, votre question sur plusieurs projets dans le même repo.

Git ne prend pas en charge les extractions parallèles de plusieurs branches dans le même référentiel. Vous voudrez peut-être regarder dans submodules pour intégrer plusieurs repos.

+0

Merci pour votre explication sur le travail avec une télécommande. Je viens d'essayer d'utiliser un seul repo git dans "src" et d'ajouter deux télécommandes aux projets A et B. J'ai beaucoup de problèmes (deux lignes: D), trop de branches mixtes, etc. I jetterai un coup d'oeil aux modules. Merci – Alex

+0

Bon article. +1 Peut être http://stackoverflow.com/questions/572893/cloning-a-non-standard-svn-repository-with-git-svn/572898#572898 peut avoir aidé à obtenir une hiérarchie de branche "plus propre" avec Git. . (et git2svn pour repousser les changements à svn) – VonC

+0

Ceci est aussi utile http://stackoverflow.com/questions/572893/cloning-a-non-standard-svn-repository-with-git-svn/572898#572898 . J'ai maintenant vu l'option "préfixe", et cela devrait aider à clarifier quelle branche vient d'où! – Alex

Questions connexes