Comment git-svn cloner les n dernières révisions d'un dépôt Subversion?

314

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 clonecommande 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' -rNoption où se Ntrouve 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~3par 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

git-clone

git-svn

Lernkurve
la source
6
Répondre à ma propre question: -s is for --stdlayout which presumes the svn recommended layout for tags, trunk, and branches.(mais n'a pas fonctionné pour moi)
Sebastián Grignoli
Comment serait - il difficile à mettre en œuvre --depthpour git svn, puisque le support est déjà là. Et il doit déjà trouver la dernière version du serveur?
Peter Cordes

Réponses:

238

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 nvalidations. Mais dans SVN (et donc dans Git-SVN), vous devrez trouver le numéro de révision vous-même.

Paul
la source
5
que se passe-t-il si je souhaite continuer à cloner la révision antérieure à l'avenir, est-ce possible?
Zennichimaro
5
@Zennichimaro: Vous pouvez le faire en ajoutant un autre git-svn télécommande pointant au même endroit et en utilisant git-svn fetchpour obtenir plus d'arborescence. À ce stade, vous devez utiliser git filter-branchpour reparent l'ancien arbre (partiel) sur la branche de droite.
Ben Jackson
Paul est là pour moi pour obtenir les dernières révisions en effectuant la migration incrémentielle de SVN vers Git ( stackoverflow.com/questions/29161646/… )
SabareeshSS
1
SVN utilise des entiers consécutifs pour identifier les révisions, ce qui rend encore plus trivial le retour en arrière n commits ...
harmic
Je pense qu'il manque un espace après -r. Par exemple, git svn clone -r 1133: HEAD some / svn / repo
Gnana
92

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

# checkout a specific revision
git svn clone -r N svn://some/repo/branch/some-branch
# enter it and get all commits since revision 'N'
cd some-branch
git svn rebase

Et un bon moyen de savoir où une branche a commencé est de la faire svn loget de trouver la première sur la branche (la dernière répertoriée lors de l'exécution):

svn log --stop-on-copy svn://some/repo/branch/some-branch

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.

Christian
la source
1
+1 de ma part - m'a aidé à contourner un problème d'erreur 128 que je devais cloner tout un dépôt svn
Ian Oxley
la commande svn log était exactement ce que je cherchais! merci
mrbrdo
1
Les dépôts avec lesquels je travaille ont une ramification et une disposition non standard, donc je crée généralement un dépôt Git local pour chaque branche SVN, puis cherry-pick/ rebaseentre ceux-ci. Commit prend une étape supplémentaire ( push, puis dcommitdu repo à distance), mais je pense que cela vaut le compromis.
chronospoon
Je n'avais pas pensé à ça, ça pourrait être plus rapide de cloner des tags / branches spécifiques comme vous le dites :)
VeenarM
34

... 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 utilisergit 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 clonepour cloner les 50 dernières révisions

# -u    The SVN URL to clone
# -l    The limit of revisions
# -o    The output directory

./git-svn-cloneback.sh -u https://server/project/trunk -l 50 -o myproj --authors-file=svn-authors.txt

Trouver la précédente révision N à partir d'un dépôt SVN

# -u    The SVN URL to clone
# -l    The limit of revisions

./svn-lookback.sh -u https://server/project/trunk -l 5     
jonathan.cone
la source
Cela donnera une fissure, notre référentiel a environ 170 000 révisions et cela prend trop de temps pour faire un seul projet, et j'ai plus de 10 projets spécifiques dans le référentiel à faire: | Envisager de faire seulement 3-4 ans d'histoire seulement.
VeenarM
1
Merci d'avoir partagé ça!
Kai Mechel