Comment utiliser deux projets SVN et les branches git-svn correspondantes avec un seul répertoire de travail?

StackOverflow https://stackoverflow.com/questions/609872

  •  03-07-2019
  •  | 
  •  

Question

Je suis relativement nouveau dans Git, mais je veux essayer (vs SVN et Bazaar).

Quelqu'un peut-il me recommander un flux de travail pour une situation similaire à celle-ci:

  • 1 référentiel SVN, avec plusieurs projets
  • 1 copie de travail "src"

L’idée est que dans " src " J'ai besoin de commander le projet A ou parfois le projet B. Les deux projets ont plusieurs branches.

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

Ensuite, j'ai fait un dépôt git dans "src" et git à distance ajouter projA ..a_repo_git , " à partir de git distant ajouter projB ..b_repo_git " .

Maintenant, je peux les voir tous les deux dans " src " en utilisant "git remote", et je peux voir leurs branches avec "git remote show projA"

Et maintenant le problème ..

  • Comment accéder à " src " une des branches de projA / projB?
  • Comment puis-je les modifier, puis pouvoir les repousser (d'abord dans git_repos, ou directement dans le référentiel SVN)?
  • S'agit-il de "flux de travail"? ok, 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 manipulations avec "fetch" J'ai réussi à obtenir les choses. Mais ensuite, j'ai eu du mal à le repousser vers a_repo_git , puis vers SVN. C’était surtout des essais et des erreurs.

Je dois admettre que j'ai toujours des problèmes avec les branches distantes! (et je me perds quand je dois utiliser " origine local_branch: origine_branch " ou " origine code_origine: local_branch ", ou " origine code_origine" "ou" origin / origine_branch "! Revenez au manuel Git pour en savoir plus.)

Était-ce utile?

La solution

Je n’ai pas mis à jour la question, car au cours des derniers jours, j’ai pu travailler très facilement avec l’aide de mon nouveau dépôt:)

Voici ce que j'ai fait à la fin:

Initiez deux dépôts SVN dans le même répertoire. (Je ne peux pas me souvenir pour le moment, mais il est possible qu'un "git init" ait été créé 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 dépôts SVN sont au format standard, avec jonction, branches et balises au même niveau.

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

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

Le fichier: /// chemin est le chemin du référentiel SVN et du projet à l'intérieur du référentiel, dans ce cas. J'utilise " fichier: // " parce que j'ai utilisé un repo de fichier à plat, sans serveur. Je suis sûr que cela fonctionne bien avec http: // aussi, pour un serveur SVN.

Après cette étape, par curiosité, j’ai jeté un œil au fichier src / .git / config. Les deux commandes ci-dessus ont créé plusieurs "svn-remote". sections, une pour chaque projet (option -R) et une version générique appelée "svn". J'ai modifié les entrées, il n'y aura donc que des références aux projets. Chaque référence comportait des entrées pour le chemin du dépôt (fetch) et pour les balises / branches / trunk. Si vous consultez le fichier, vous comprendrez ce qui doit être changé.

Après cela, j'ai récupéré 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, lancez " git branch -a " affiché toutes les branches des deux dépôts, ainsi que la branche principale (locale). "git branch -r" n'a pas affiché de branches; probablement parce qu'ils sont " svn-remote " et non "à distance"

Le & maître; maître & courant; branche pointait vers le tronc du deuxième projet. J'ai décidé de m'en débarrasser, car cela poserait des problèmes lors du passage d'un projet à l'autre.

J'ai créé deux nouvelles branches pour pointer sur les troncs de chaque projet, puis supprimé 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 "workflow" ;; 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 extraire 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 la même chose. En fin de compte, je peux avoir le contenu du projet A ou B dans le même répertoire "src", et avoir accès aux deux projets du référentiel SVN à partir du même dépôt git! : D

Je ne sais toujours pas comment créer une branche locale, puis la transférer dans le dépôt SVN. J'étais proche, mais cela n'a pas fonctionné.

Il peut également être utile de connaître la commande "Réinitialiser". ("git reset --hard projPrefix / branch") mais je me suis cassé quelques objets en l'utilisant, il est donc peut-être préférable de laisser cela pour un autre moment.

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

Salut, Alex

Autres conseils

Considérons d’abord le cas plus simple d’un référentiel distant et d’un référentiel local.

Un distant dans le référentiel local fonctionne "uniquement". comme une référence à l'autre repo. Vous pouvez utiliser chercher pour récupérer les objets distants dans votre magasin local:

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

Maintenant, toutes les branches de en amont peuvent être référencées localement et traitées en utilisant en amont / nom de la branche . Pour vraiment travailler sur une branche distante, vous devez toujours créer une branche locale qui suit la branche distante:

git checkout -b new_local_branchname upstream/branchname

Vous pouvez maintenant travailler localement et valider / fusionner autant de fois que vous le souhaitez. Enfin, vous pouvez pousser vous revenez dans le référentiel central. Le bit important est que AFAIK push ne peut effectuer que des fusions en avance rapide, c'est-à-dire télécharger les modifications et définir la nouvelle tête. Par conséquent, vous devez préparer votre branche locale de manière à ce que les modifications locales commencent sur le dessus de la branche distante. Vous pouvez utiliser rebase pour éviter cela, ou éviter de modifier référentiel central pendant que vous travaillez localement.

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

git svn complique l'image en le contraignant 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 commits au fur et à mesure qu'ils entrent dans le référentiel SVN pour ajouter les métadonnées nécessaires. Ce dernier fait est probablement la raison de nombre de vos problèmes, car les commits sur la branche SVN auront toujours des hachages différents des commits originaux sur vos branches locales.

Enfin, votre question sur plusieurs projets dans le même référentiel.

Git ne prend pas en charge les extractions parallèles de plusieurs branches dans le même référentiel. Vous voudrez peut-être vous renseigner sur les sous-modules pour intégrer plusieurs référencements.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top