Comment puis-je garder un svn:external à jour en utilisant git-svn?

traiter mon dépôt comme un SVN repo, je reçois:

svn co http://myrepo/foo/trunk foo
...
foo/
  bar/
  baz/ -> http://myrepo/baz/trunk

en le traitant comme un git repo, je comprends:

git svn clone http://myrepo/foo --trunk=trunk --branches=branches --tags=tags
...
foo/
  bar/

je peux cloner baz sur ma machine locale ailleurs et Ajouter un lien symbolique, mais c'est juste un piratage. Est-ce qu'il y a un moyen d'avoir git svn rebase automatiquement tirer dans ces changements quand il met à jour tout le reste, tout comme svn up fait?

51
demandé sur Jonas 2008-12-08 22:52:06

8 réponses

le meilleur moyen d'intégrer svn externals avec git-svn que j'ai vu est ce script , qui clone vos externes dans un .git_externals / directory et crée les liens symboliques et exclut les fichiers dont vous avez besoin. Je trouve cela d'une façon simple et directe de la solution. YMMV.

voici un ancien aperçu d'autres options pour traiter avec svn externals avec git-svn. Pour moi, ils ont l'air un peu trop compliqués et susceptibles de briser utilisation ultérieure de Git.

24
répondu Paul 2008-12-08 21:31:23

la solution que j'ai finalement utilisée était de faire un lien symbolique avec d'autres clones git-svn sur ma boîte locale. Cela a plutôt bien fonctionné: cela m'a permis d'engager des changements en retour, et cela m'a permis de faire des changements locaux sur le projet A juste pour les faire entrer dans le projet B.

22
répondu James A. Rosen 2009-01-23 18:47:45

je viens d'écrire un script court qui vérifie tous les svn:externals du HEAD courant dans le répertoire racine et les exclut du dépôt git.

placez-le à .git/hooks/post-checkout et il gardera ces vérifications externes à jour chaque fois que l'arbre de travail change, par exemple en raison de git svn rebase ou git-checkout .

#!/bin/bash
set -eu

revision=$(git svn info | sed -n 's/^Revision: \([1-9][0-9]*\)$//p')
git svn -r${revision} propget svn:externals | head -n-1 | {
    while read checkout_args
    do
        checkout_dirname=$(echo ${checkout_args} | cut -d' ' -f3)
        svn checkout ${checkout_args}
        if [ -z $(grep ${checkout_dirname} .git/info/exclude) ]
        then
            echo ${checkout_dirname} >> .git/info/exclude
        fi
    done
}
4
répondu tuomasjjrasanen 2011-12-16 08:19:00

j'ai aussi fait un script (à la fois Perl et Ruby variantes disponibles) qui fait cela pour moi, il est à http://github.com/liyanage/git-tools / .

  • vérifie récursivement tous les svn: externals
  • peut être lancé à plusieurs reprises au cas où le clone d'un grand dépôt s'arrête à mi-chemin. M'est arrivé beaucoup de choses. Il reprend là où il l'avait laissé.
  • ajoute toutes les entrées svn:externals qu'il trouve et traite de. git/info/exclure
  • ajoute tout svn: ignore les entrées qu'il rencontre .git/info/exclure
  • peut être exécuté régulièrement après la première exécution pour faire le SVN: rebase dans toutes les boîtes de sous-sable clonées, découvrir de nouveaux externes et de nouveaux svn: ignore

mise à jour: Je ne maintiens plus ce script. Sa fonctionnalité de Clonage récursif et de mise à jour D'un dépôt SVN, ainsi que d'autres fonctionnalités liées à git, est disponible dans ce nouveau projet que je maintiens activement: http://liyanage.github.com/git-tools/

4
répondu Marc Liyanage 2013-03-04 22:16:10

Juste pour le record: j'ai suivi ce suggestion et essayé d'utiliser SmartGit pour traiter les svn:externals .

SmartGit est de loin le meilleur client GUI que j'ai jamais vu pour Git. En ce qui concerne svn:externals , non seulement il les récupère correctement, mais il présente également la possibilité de faire un" instantané rapide " (clone en lecture seule, tête seule) des dépôts externes.

Malheureusement, il n'est pas gratuit pour utilisation commerciale (et j'ai trouvé le prix de la licence un peu trop élevé - Oui je suis un radin). Il peut être utilisé gratuitement à des fins non commerciales.

2
répondu rsenna 2017-05-23 10:29:16

j'ai décidé d'écrire un script perl" simple " pour gérer tous ces trucs pour moi. Je l'ai mis récemment à github, essayer, peut-être que cela aiderait: http://github.com/sushdm/git_svn_externals/ .

il fait essentiellement git-svn clone pour tous les externes trouvés, et il les cherche récursivement, clones, symlinks eux dans les endroits appropriés et exclut tous .git_externals DRS et symlinks de sorte que vous pouvez toujours utiliser 'git svn dcommit'.

bonne chance.

1
répondu Dmitry 2009-08-18 16:37:35

essayez ce script python https://bitbucket.org/nytmyn/gitsvnext/overview

pour effectuer la commande svn externals, exécutez la commande suivante dans votre dépôt git

python /../gitsvnext/run update

exécuter ce savoir quoi mettre .git/info/exclure

python /../gitsvnext/run list
1
répondu opekar 2012-03-10 17:27:19

voilà ce que j'ai fait.

J'ai d'abord créé un SVN repo vide (pour la même racine que le git):

svn checkout --depth empty http://path/to/repo .

cela a créé un SVN repo vide dans la racine git. Le point est que is contient les propriétés externes de SVN.

ensuite je ne vérifie que les externes (j'ai placé dans les outils de chemin cygwin):

svn propget svn:externals | sed -e 's/ / .\//' | sed -e 's/\'//g' | xargs -L1 svn co
1
répondu TCS 2015-11-13 13:08:30