J'utilise git-svn
pour travailler avec le référentiel Subversion central de mon entreprise. Nous avons récemment créé une nouvelle branche de fonctionnalités dans le dépôt central.
Comment en parler à Git? Lorsque j'exécute, git branch -r
je ne peux voir que les branches qui existaient lorsque j'ai exécuté fetch
le dépôt Subversion pour initialiser mon dépôt Git?
Réponses:
Vous pouvez ajouter manuellement la branche distante,
la source
fatal: Cannot setup tracking information; starting point 'newbranch' is not a branch.
à l'étape de paiement git.Si vous souhaitez suivre TOUTES les branches svn distantes, la solution est aussi simple que:
Cela récupérera TOUTES les branches distantes qui n'ont pas encore été récupérées.
Astuce supplémentaire: si vous avez extrait uniquement le tronc au début, et plus tard vous souhaitez suivre TOUTES les branches, modifiez-le
.git/config
pour ressembler à ceci et relancezgit svn fetch
:Les points clés
url
doivent pointer vers la racine du référentiel et les chemins définis dansfetch
etbranches
doivent être relatifs àurl
.Si vous voulez récupérer uniquement des branches spécifiques au lieu de TOUTES, il y a un bel exemple dans
git svn --help
:Avec les anciennes versions de
git-svn
, une fois que vous avez spécifié des branches comme celle-ci, vous ne pourrez peut-être pas obtenir de nouvelles branches avecgit svn fetch
. Une solution de contournement consiste à ajouter plus defetch
lignes, comme ceci:Une autre solution de contournement par @AndyEstes: modifiez
.git/svn/.metadata
et modifiez la valeur debranches-maxRev
outags-maxRev
en une révision avant la création de toutes les branches ou balises nouvellement spécifiées. Une fois que vous avez fait cela, exécutezgit svn fetch
pour suivre la nouvelle branche distante svn.la source
.git/svn/.metadata
été très utile! J'ajoutais des branches supplémentaires dans my.git/config
, quigit svn fetch
n'ont pas repris - parce que le numéro de révision des métadonnées était "trop avancé". Dans un cas, seul le dernier commit d'une branche a été récupéré. Je me suis débarrassé manuellement de la branche défectueuse (renommée.git/svn/refs/remotes/svn/qa/XYZ
en.git/svn/refs/remotes/svn/qa/XYZ~
, abandonné son existence.git/packed-refs
, etc.) ... j'ai choisi un numéro de révision "antérieur" pour les métadonnées ... courugit svn fetch
pour enfin obtenir un historique complet avec un graphique correct et connecté.git svn fetch --all
.Il semble que j'en avais juste besoin
git svn fetch
; d'une manière ou d'une autre, je m'étais convaincu que cela permettrait de récupérer l'intégralité du dépôt au lieu des seuls changements.la source
Peut-être que je l'ai gâché d'une manière ou d'une autre, mais j'ai suivi les instructions de la réponse de vjangus et cela a presque fonctionné. Le seul problème était que newbranch ne semblait pas être ramifié à partir du tronc. Dans gitk, c'était un peu "flottant" tout seul; il n'avait pas d'ancêtre commun avec le tronc.
La solution à cela était:
git diff-tree <sha1 from step 1> <sha1 from step 2>
- il ne devrait y avoir aucune sortie. S'il y a une sortie, vous avez peut-être sélectionné les mauvais commits.git checkout local-newbranch
alorsgit rebase <sha1 from step 1>
. Cela rebaseralocal-newbranch
sur le nouvel arbre maisremotes/newbranch
sera toujours déconnecté..git/refs/remotes/newbranch
et modifiez-le pour qu'il contienne le SHA1 complet du nouveau commit (sur le rebasénewbranch
) qui correspond à l'ancien commit sur lequel il pointe actuellement. (Ou peut-être utilisergit-update-ref refs/remotes/newbranch <new-SHA>
. Merci Inger.)git svn dcommit
ànewbranch
, vous aurez un tas de messages à ce sujet la mise à jour un certain journal. C'est normal je pense.Je recommande de rester
gitk --all
ouvert tout le temps et de le rafraîchir souvent pour suivre ce que vous faites. Je suis encore un peu nouveau dans git et git svn, alors veuillez suggérer des améliorations à cette méthode.la source
Une simplification de la réponse de vjangus:
Si vous utilisez la mise en page standard dans SVN et que vous avez fait le svn init habituel, git-svn s'occupera de la configuration pour vous. Juste:
Un exemple. L'URL SVN est
svn+ssh://[email protected]/repo
. La branche SVN que je recherche estnewbranch
. La branche locale git (suivi à distancenewbranch
) seragit-newbranch
.Étape 1: recherchez la révision de la copie de branche
Le point de branchement dans SVN est donc la révision 7802.
Étape 2: récupérer la révision
git-svn a fait tout le travail et connaît maintenant la télécommande:
Étape 3: Créez votre nouvelle succursale locale en suivant la distante:
la source
show-ref
c'est inestimable)! Pour toute personne coincée avec un référencement erroné des branches distantes, vous pouvez les supprimer (je devais le fairegit branch -d newbranch
, puis forcer la suppression du répertoire de référence.git/svn/refs/remotes/newbranch
), puis recommencer à l'étape 2 (ci-dessus).Je n'ai trouvé aucune documentation sur cette fonctionnalité, mais il semble que la configuration de git svn prend en charge plusieurs entrées de récupération. De cette façon, vous pouvez également ajouter des branches séparément sans avoir besoin d'ajouter une autre entrée de référentiel svn distante à votre configuration ni d'utiliser des caractères génériques pour obtenir toutes les branches de certains répertoires.
Supposons que votre arbre SVN est vraiment méchant d'avoir beaucoup de branches sans aucune logique sur la façon dont elles sont localisées, par exemple avoir des branches et des sous-répertoires contenant plus de branches.
c'est à dire
et vous voulez juste choisir à la main certaines des branches à inclure dans votre dépôt git.
Vous pouvez d'abord initialiser votre référentiel avec uniquement le tronc sans aucune branche supplémentaire:
Après cela, vous devriez voir la configuration suivante:
chaque fois que vous voulez récupérer une nouvelle branche de MyRepo, vous pouvez simplement ajouter de nouvelles entrées de récupération à la configuration en:
Ou vous pouvez modifier la même configuration dans .git / config
Pour récupérer les nouvelles branches après les avoir ajoutées à la configuration, exécutez simplement:
[Edit] Parfois, il semble nécessaire d'exécuter fetch avec le paramètre --all pour récupérer les branches nouvellement ajoutées:
la source
Au lieu de gérer les bizarreries git-svn, vous pouvez essayer SubGit .
Il faut installer SubGit dans le référentiel Subversion. Après cela, on peut utiliser le workflow git standard au lieu d'utiliser des commandes spéciales git-svn:
Pousser de nouveaux commits:
git-svn:
SubGit:
Récupération des modifications entrantes
git-svn:
SubGit:
Créer une nouvelle branche:
git-svn:
SubGit:
Voir la documentation SubGit pour plus de détails.
la source
Pour ajouter à la réponse de vjangus, qui m'a aidé, j'ai également trouvé utile d'ajouter des greffes use git pour attacher les branches au tronc au point approprié - permettant à git de voir l'historique et d'effectuer correctement les fusions.
Il s'agit simplement d'ajouter une ligne
.git/info/grafts
avec les hachages:par exemple.
Crédit à http://evan-tech.livejournal.com/255341.html
(J'ajouterais ceci en commentaire, mais je n'ai pas assez de réputation.)
la source
Si vous ne procédez pas à l'extraction avec une mise en page valide, vous ne pourrez pas récupérer une succursale distante.
C'est ce que je fais:
Après cela, vous pouvez basculer vers une branche distante:
Ensuite, vous serez automatiquement basculé vers votre agence.
la source