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

En traitant mon repository comme un référentiel SVN, j’obtiens:

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

En le traitant comme un repo Git, j’obtiens:

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

Je peux cloner baz sur ma machine locale et append un lien symbolique, mais ce n’est qu’un hack. Y at-il un moyen d’avoir automatiquement git svn rebase lorsqu’il met à jour tout le rest, comme le fait svn up ?

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

Voici un aperçu plus ancien des autres options permettant de gérer svn externals avec git-svn. Pour moi, ils sont un peu trop compliqués et risquent de se briser lors de l’utilisation de Git.

La solution que j’ai finalement utilisée consistait simplement à créer un lien symbolique vers d’autres clones de git-svn sur ma boîte locale. Cela a très bien fonctionné: cela me permet de valider les modifications et cela me permet de faire des changements locaux sur le projet A pour les intégrer au projet B.

Je viens d’écrire un script court qui vérifie tous les svn:externals de la HEAD actuelle dans le répertoire racine et les exclut du repository git.

Placez-le sur .git/hooks/post-checkout et gardez ces extractions externes à jour chaque fois que l’arborescence change, par exemple à cause de git svn rebase ou de git-checkout .

 #!/bin/bash set -eu revision=$(git svn info | sed -n 's/^Revision: \([1-9][0-9]*\)$/\1/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 } 

J’ai aussi fait un script (les deux variantes de Perl et Ruby disponibles) qui fait cela pour moi, c’est à http://github.com/liyanage/git-tools/ .

  • Récupère récursivement tous les svn: externals
  • Peut être exécuté à plusieurs resockets si le clone d’un grand référentiel est interrompu à mi-chemin. Est arrivé à moi beaucoup. Il reprend là où il s’est arrêté.
  • Ajoute tout svn: entrées externes qu’il trouve et traite à .git / info / exclude
  • Ajoute tout svn: ignore les entrées qu’il rencontre à .git / info / exclude
  • Peut être exécuté régulièrement après la première exécution de svn: rebase dans tous les sous-sandbox clonés, découvre de nouvelles externes et de nouveaux svn: ignores

Mise à jour: Je ne maintiens plus ce script. Ses fonctionnalités pour le clonage et la mise à jour récursifs d’un référentiel SVN, ainsi que d’autres fonctionnalités liées à git, sont disponibles dans ce nouveau projet que je maintiens activement: http://liyanage.github.com/git-tools/

Juste pour mémoire: j’ai suivi cette suggestion et essayé d’utiliser SmartGit pour gérer svn:externals .

SmartGit est de loin le meilleur client d’interface graphique que j’ai jamais vu pour Git. En ce qui concerne svn:externals , non seulement il les récupère correctement, mais il offre également la possibilité de faire un “instantané rapide” (clone en lecture seule, HEAD uniquement) de référentiels externes.

Malheureusement, ce n’est pas gratuit pour un usage commercial (et j’ai trouvé le prix de la licence un peu trop élevé – oui, je suis un peu cher). Il peut être utilisé gratuitement à des fins non commerciales.

J’ai décidé d’écrire un “simple” script perl pour gérer tout cela pour moi. Je l’ai mis récemment à github, essayez-le, peut-être que cela vous aiderait: http://github.com/sushdm/git_svn_externals/ .

Il fait essentiellement le clone de git-svn pour tous les externes trouvés, et les recherche récursivement, clone, les lie symboliquement à des endroits appropriés et exclut tous les répertoires et liens symboliques .git_externals afin que vous puissiez toujours utiliser ‘git svn dcommit’.

Bonne chance.

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

pour vérifier svn externals exécuter suivre dans votre repository git

 python /../gitsvnext/run update 

lancez ceci pour savoir quoi mettre à .git / info / exclude

 python /../gitsvnext/run list 

Voici ce que j’ai fait.

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

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

Cela a créé un svn repo vide dans la racine git. Le point est qu’il contient les propriétés externes SVN.

Ensuite, je vérifie simplement les externes (j’ai placé dans les outils PATH cygwin):

 svn propget svn:externals | sed -e 's/ / .\//' | sed -e 's/\'//g' | xargs -L1 svn co