Problème
Comment créer une copie superficielle avec git-svn à partir d'un référentiel Subversion, par exemple, comment extraire uniquement les trois dernières révisions?
La git clone
commande peut obtenir les n dernières révisions d'un référentiel Git si vous utilisez l'option --depth
, c'est-à-dire que vous obtenez une copie superficielle du référentiel. Exemple:
git clone --depth 3 git://some/repo myshallowcopyrepo
Existe-t-il une option similaire pour git-svn?
Mes découvertes à ce jour
Jusqu'à présent, je n'ai trouvé que l' -rN
option où se N
trouve la révision à tirer. Exemple:
git svn clone -rN svn://some/repo
Selon la documentation, il est possible d'utiliser -r$REVNUMBER:HEAD
. J'ai essayé ce qui suit pour obtenir les 3 dernières révisions qui ont renvoyé un message d'erreur.
$ git svn clone --prefix=svn/ -s -rHEAD~3:HEAD http://some/svn/repo .
revision argument: HEAD~3:HEAD not understood by git-svn
J'ai donc remplacé HEAD~3
par le numéro réel de la troisième mais dernière révision 534. Cela a fonctionné, mais cela nécessite que je détermine d'abord le numéro de révision de la troisième mais dernière validation.
$ git svn clone --prefix=svn/ -s -r534:HEAD http://some/svn/repo .
Documentation
-s is for --stdlayout which presumes the svn recommended layout for tags, trunk, and branches.
(mais n'a pas fonctionné pour moi)--depth
pourgit svn
, puisque le support est déjà là. Et il doit déjà trouver la dernière version du serveur?Réponses:
Vous avez déjà découvert le moyen le plus simple de spécifier un clone peu profond dans Git-SVN, en spécifiant le numéro de révision SVN auquel vous souhaitez démarrer votre clone (
-r$REV:HEAD
).Par exemple:
git svn clone -s -r1450:HEAD some/svn/repo
La structure de données de Git est basée sur des pointeurs dans un graphe acyclique dirigé (DAG), ce qui rend trivial le retour en arrière des
n
validations. Mais dans SVN (et donc dans Git-SVN), vous devrez trouver le numéro de révision vous-même.la source
git-svn
télécommande pointant au même endroit et en utilisantgit-svn fetch
pour obtenir plus d'arborescence. À ce stade, vous devez utilisergit filter-branch
pour reparent l'ancien arbre (partiel) sur la branche de droite.n
commits ...Je me retrouve souvent à utiliser ce qui suit pour obtenir un nombre limité de révisions de notre énorme arbre de subversion (nous atteignons bientôt la révision svn 35000).
Et un bon moyen de savoir où une branche a commencé est de la faire
svn log
et de trouver la première sur la branche (la dernière répertoriée lors de l'exécution):Jusqu'à présent, je n'ai pas vraiment trouvé la peine de suivre toutes les branches. Il faut trop de temps pour cloner et svn et git ne fonctionnent pas aussi bien que je le souhaiterais. J'ai tendance à créer des fichiers correctifs et à les appliquer sur le clone git d'une autre branche svn.
la source
cherry-pick
/rebase
entre ceux-ci. Commit prend une étape supplémentaire (push
, puisdcommit
du repo à distance), mais je pense que cela vaut le compromis.... 7 ans plus tard, dans le désert, un tumbleweed souffle par ...
Je n'étais pas satisfait de la réponse acceptée, j'ai donc créé des scripts pour le faire disponibles sur Github . Ceux-ci devraient aider toute personne qui souhaite utiliser
git svn clone
mais ne veut pas cloner l'intégralité du référentiel et ne veut pas rechercher une révision spécifique à cloner au milieu de l'historique (peut-être que vous clonez un tas de référentiels). Ici, nous pouvons simplement cloner les N dernières révisions:Utilisez
git svn clone
pour cloner les 50 dernières révisionsTrouver la précédente révision N à partir d'un dépôt SVN
la source