web-dev-qa-db-fra.com

Comment puis-je informer git-svn d'une branche distante créée après avoir récupéré le référentiel?

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?

189
Hank Gay

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
288
vjangus

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.

92
janos

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.

53
Hank Gay

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:

  1. Recherchez le SHA1 du dernier commit qui s'est produit sur la jonction avant la création de la branche.
  2. Trouvez le SHA1 du premier commit sur la nouvelle branche (le message est probablement "Création d'une nouvelle branche, copié à partir de trunk @ 12345" ou quelque chose du genre)
  3. 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.
  4. 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é.
  5. Aller au fichier .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.)
  6. La prochaine fois que vous 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.

14
MatrixFrog

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:

  1. Rechercher une révision de copie de branche dans SVN
  2. Récupérez cette révision avec git-svn
  3. Créer une nouvelle télécommande de suivi de branche locale

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' 
7
Gil Hamilton

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
5
Mikael Lepistö

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:

  1. Pousser de nouveaux commits:

    git-svn:

    $ git commit
    $ git svn rebase
    $ git svn dcommit
    

    SubGit:

    $ git commit
    $ git Push
    
  2. Récupération des modifications entrantes

    git-svn:

    $ git svn rebase
    

    SubGit:

    $ git pull [--rebase]
    
  3. 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.

4
vadishev

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.)

2
Haddon CD.

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.

0
MikeHoss