J'utilise git-svn
pour travailler contre le référentiel central svn
de mon entreprise. Nous avons récemment créé une nouvelle branche de fonctionnalité dans le référentiel central. Comment puis-je en parler à git
? Quand je cours git branch -r
_ Je ne peux voir que les branches qui existaient lorsque j’ai exécuté fetch
contre le svn
repo pour initialiser mon git
repo?
Vous pouvez ajouter manuellement la branche distante,
git config --add svn-remote.newbranch.url https://svn/path_to_newbranch/
git config --add svn-remote.newbranch.fetch :refs/remotes/newbranch
git svn fetch newbranch [-r<rev>]
git checkout -b local-newbranch -t newbranch
git svn rebase newbranch
Si vous voulez suivre TOUTES les branches svn distantes, la solution est aussi simple que:
git svn fetch
Cela va chercher TOUTES les branches distantes qui n'ont pas encore été récupérées.
Conseil supplémentaire: si vous avez uniquement extrait le coffre au départ et que vous souhaitez suivre toutes les branches plus tard, modifiez .git/config
pour ressembler à ceci et relancer git svn fetch
:
[svn-remote "svn"]
url = https://svn/path_to_repo_root/
fetch = path_to_trunk:refs/remotes/git-svn
branches = path_to_branches/*:refs/remotes/*
Les points clés sont url
doivent pointer vers la racine du référentiel et les chemins définis dans fetch
et branches
doivent être relatifs à url
.
Si vous voulez extraire uniquement des branches spécifiques au lieu de ALL, il existe un exemple Nice dans git svn --help
:
[svn-remote "huge-project"]
url = http://server.org/svn
fetch = trunk/src:refs/remotes/trunk
branches = branches/{red,green}/src:refs/remotes/branches/*
tags = tags/{1.0,2.0}/src:refs/remotes/tags/*
Avec les anciennes versions de git-svn
, une fois que vous avez spécifié des branches comme ceci, vous ne pourrez peut-être plus obtenir de nouvelles branches avec git svn fetch
. Une solution consiste à ajouter plus de fetch
lignes, comme ceci:
[svn-remote "huge-project"]
url = http://server.org/svn
fetch = trunk/src:refs/remotes/trunk
fetch = branches/blue:refs/remotes/branches/blue
fetch = branches/yellow:refs/remotes/branches/yellow
branches = branches/{red,green}/src:refs/remotes/branches/*
Une autre solution de contournement de @AndyEstes: edit .git/svn/.metadata
et modifier la valeur de branches-maxRev
ou tags-maxRev
à une révision avant la création des branches ou des balises nouvellement spécifiées. Une fois que cela est fait, lancez git svn fetch
pour suivre la nouvelle branche distante svn.
Il semble que j'avais juste besoin de git svn fetch
; de façon ou d'autre, je m'étais convaincu que chercherait le rapport entier au lieu des changements.
Peut-être que j'ai tout gâché, mais j'ai suivi les instructions de la réponse de vjangus et cela presque a fonctionné. Le seul problème était que newbranch ne semblait pas être branché à partir du coffre. En gitk, c'était un peu "flottant" tout seul; il n'avait aucun 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
puis git rebase <sha1 from step 1>
. Cela rebase local-newbranch
sur le nouvel arbre mais remotes/newbranch
sera toujours déconnecté..git/refs/remotes/newbranch
et éditez-le pour qu'il contienne l'intégralité de SHA1 du nouvea commit (sur le rebasé newbranch
) qui correspond à l'ancien commit sur lequel il pointe actuellement. (Ou peut-être utiliser git-update-ref refs/remotes/newbranch <new-SHA>
. Merci inger.)git svn dcommit
à newbranch
, vous recevrez un tas de messages à propos de la mise à jour du journal. C'est normal je pense.Je recommande de garder gitk --all
ouvrez tout le temps et rafraîchissez-le souvent pour garder une trace de ce que vous faites. Je suis encore un peu nouveau pour git et git svn alors n'hésitez pas à suggérer des améliorations à cette méthode.
Une simplification de la réponse de vjangus:
Si vous utilisez la mise en page standard dans SVN et que vous avez exécuté svn init, git-svn se chargera de la configuration. Juste:
Un exemple. SVN url is svn+ssh://[email protected]/repo
. La branche SVN que je cherche est newbranch
. La branche git locale (suivi de la télécommande newbranch
) sera git-newbranch
.
Étape 1: trouver la révision de la branche
# svn log - arrêt sur copie svn + ssh: //[email protected]/repo/branches/newbranch | tail -4 r7802 | quelqu'un | 2014-03-21 18:54:58 +0000 (ven, 21 mars 2014) | 1 ligne Embranchement HEAD to newbranch -------------------- -------------------------------------------------- -
Le point de branchement dans SVN est donc la révision 7802.
Étape 2: récupérez la révision
# git svn fetch -r 7802 Point de branchement possible trouvé: svn + ssh: //[email protected]/repo/trunk => svn + ssh: //[email protected]/repo/branches/newbranch, 7801 parent de branche trouvé: (refs/remote/trunk) 8dcf3c5793ff1a8a79dc94d268c91c2bf388894a suivant parent avec do_switch Le parent A suivi avec succès r7802 = 9bbd4194041675ca5c9c6f3917e05ca5654a8a1e (refs/remote/newbranch)
git-svn a fait tout le travail et connaît maintenant la télécommande:
# git show-ref | grep newbranch 2df23af4733f36f5ad3c14cc1fa582ceeb3edb5c réfs/télécommandes/newbranch
Étape 3: Créez votre nouvelle succursale locale en suivant celle distante:
# git checkout -b git-newbranch -t newbranch Extraire des fichiers: 100% (413/413), terminé. Branch git- newbranch mis en place pour suivre les références/télécommandes/newbranch locales. Basculé vers une nouvelle branche 'git-newbranch'
Je n'ai trouvé aucune documentation sur cette fonctionnalité, mais il semble que la configuration de git svn prenne en charge plusieurs entrées d'extraction. 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 à distance à 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 soit vraiment méchant avec beaucoup de branches sans aucune logique, par exemple comment elles sont situées. avoir des branches et des sous-répertoires contenant plus de branches.
c'est à dire.
trunk
branches
-> branch1
-> sub-dir1
-> branch2
-> branch3
-> sub-dir2
-> branch4
-> sub-dir3
-> branchX
<... hundreds more ...>
et vous voulez juste choisir quelques branches à inclure dans votre dépôt git.
Vous pouvez commencer par initialiser votre référentiel avec uniquement le tronc sans branches supplémentaires:
git svn clone -r 10000:HEAD https://svn.com/MyRepo myrepo --prefix=svn/ --trunk=trunk
Après cela, vous devriez voir la configuration suivante:
localhost: elhigu$ git config --get-regexp "svn-remote."
svn-remote.svn.url https://svn.com/MyRepo
svn-remote.svn.fetch trunk:refs/remotes/svn/trunk
chaque fois que vous souhaitez extraire une nouvelle branche de MyRepo, vous pouvez simplement ajouter de nouvelles entrées d'extraction à la configuration en:
git config --add svn-remote.svn.fetch branches/sub-dir2/branch4:refs/remotes/svn/branches/sub-dir2/branch4
Ou vous pouvez éditer 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:
git svn fetch -r 10000:HEAD
[Edit] Il semble parfois nécessaire d'exécuter fetch avec le paramètre --all pour extraire les branches récemment ajoutées:
git svn fetch --all -r 10000:HEAD
Au lieu de traiter avec les bizarreries de git-svn, vous pouvez essayer SubGit .
Il faut installer SubGit dans le référentiel Subversion. Après cela, vous pouvez utiliser le workflow git standard au lieu d'utiliser des commandes spéciales de git-svn:
Pousser de nouveaux commits:
git-svn:
$ git commit
$ git svn rebase
$ git svn dcommit
SubGit:
$ git commit
$ git Push
Récupération des modifications entrantes
git-svn:
$ git svn rebase
SubGit:
$ git pull [--rebase]
Création d'une nouvelle branche:
git-svn:
$ git svn branch foo
$ git checkout -b foo -t remotes/foo
$ git commit
$ git svn dcommit
SubGit:
$ git checkout -b foo
$ git commit
$ git Push
Voir documentation SubGit pour plus de détails.
Pour ajouter à la réponse de vjangus, ce qui m’a aidé, j’ai également trouvé utile d’ajouter des greffons git pour lier les branches au tronc au moment approprié, ce qui permet à git de voir l’historique et d’effectuer les fusions correctement.
Il s’agit simplement d’ajouter une ligne à .git/info/grafts
avec les hachages:
<initial branch commit> <parent commit in trunk>
par exemple.
378b0ae0902f5c2d2ba230c429a47698810532e5 6c7144991381ce347d4e563e9912465700be0638
Crédit à http://evan-tech.livejournal.com/255341.html
(J'ajouterais ceci comme commentaire, mais je n'ai pas assez de réputation.)
Si vous ne vérifiez pas avec une mise en page valide, vous ne pourrez pas extraire une branche distante.
C'est ce que je fais:
git svn init -s <svn path with no trunk> local_repo
cd local_repo
git svn fetch
## wait
Après cela, vous pouvez basculer vers une branche distante:
git checkout --track -b branch_name branch_name
Ensuite, vous serez automatiquement transféré à votre succursale.