Como git-svn clonar as últimas n revisões de um repositório Subversion?

314

Problema

Como você cria uma cópia superficial com o git-svn a partir de um repositório Subversion, por exemplo, como você extrai apenas as últimas três revisões?

O git clonecomando pode obter as últimas n revisões de um repositório Git se você usar a opção --depth, ou seja, você obtém uma cópia superficial do repositório. Exemplo:

git clone --depth 3 git://some/repo myshallowcopyrepo

Existe uma opção semelhante para o git-svn?

Minhas descobertas até agora

Até agora, só encontrei a -rNopção onde Nestá a revisão. Exemplo:

git svn clone -rN svn://some/repo

De acordo com a documentação, existe a possibilidade de uso -r$REVNUMBER:HEAD. Tentei o seguinte para obter as últimas 3 revisões, que retornaram uma mensagem de erro.

$ git svn clone --prefix=svn/ -s -rHEAD~3:HEAD http://some/svn/repo .
revision argument: HEAD~3:HEAD not understood by git-svn

Então substituí HEAD~3pelo número real da terceira mas última revisão 534. Isso funcionou, mas isso exige que eu primeiro descubra o número da revisão da terceira mas última confirmação.

$ git svn clone --prefix=svn/ -s -r534:HEAD http://some/svn/repo .

Documentação

git-clone

git-svn

Lernkurve
fonte
6
Respondendo a minha própria pergunta: -s is for --stdlayout which presumes the svn recommended layout for tags, trunk, and branches.(mas não funcionou para mim)
Sebastián Grignoli
O quão difícil seria implementar --depthpara git svn, uma vez que o apoio já está lá. E ele já tem que descobrir a última rev do servidor?
Peter Cordes

Respostas:

238

Você já descobriu a maneira mais simples de especificar um clone superficial no Git-SVN, especificando o número de revisão do SVN no qual deseja iniciar o clone ( -r$REV:HEAD ).

Por exemplo: git svn clone -s -r1450:HEAD some/svn/repo

A estrutura de dados do Git é baseada em ponteiros em um gráfico acíclico direcionado (DAG), o que torna trivial a recuperação de nconfirmações. Mas no SVN (e, portanto, no Git-SVN), você terá que encontrar o número da revisão.

Paulo
fonte
5
e se eu gostaria de continuar clonando a revisão anterior no futuro, é possível?
Zennichimaro 17/07/2013
5
@ Zennichimaro: Você pode fazer isso adicionando outro git-svnapontador remoto no mesmo local e usando git-svn fetchpara obter mais da árvore. Nesse ponto, você precisa usar git filter-branchpara reparar a árvore antiga (parcial) no ramo direito.
Ben Jackson
Paul existe alguma maneira de obter as revisões mais recentes executando a Migração Incremental do SVN para o Git ( stackoverflow.com/questions/29161646/… )
SabareeshSS
1
O SVN usa números inteiros consecutivos para identificar revisões, tornando ainda mais trivial voltar atrás em ncommits ...
harmic
Acho que falta um espaço depois de -r. Por exemplo, git svn clone -r 1133: HEAD some / svn / repo
Gnana
92

Eu me pego usando o seguinte frequentemente para obter um número limitado de revisões de nossa enorme árvore de subversões (em breve estaremos alcançando a revisão 35000 da svn).

# 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

E uma boa maneira de descobrir onde uma ramificação começou é fazê- svn logla e encontrar a primeira na ramificação (a última listada ao fazer):

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

Até agora, eu realmente não achei o aborrecimento que valha a pena acompanhar todas as filiais. Leva muito tempo para clonar e svn e git não funcionam juntos tão bem quanto eu gostaria. Costumo criar arquivos de correção e aplicá-los no clone git de outro ramo svn.

cristão
fonte
1
+1 de mim - me ajudou a contornar um problema de erro 128 que eu estava tendo a clonagem de todo um svn repo
Ian Oxley
o comando svn log era exatamente o que eu estava procurando! graças
mrbrdo
1
Os repositórios com os quais trabalho têm ramificação e layout não padrão, geralmente crio um repositório Git local para cada ramo SVN e depois cherry-pick/ rebaseentre eles. A consolidação dá um passo extra ( pushe depois dcommitdo repo remoto), mas acho que vale a pena a troca.
Chronospoon
Não tinha pensado nisso, pode ser mais rápido apenas clonagem tags específicas / ramos como você diz :)
VeenarM
34

... 7 anos depois, no deserto, uma erva daninha sopra por ...

Não fiquei satisfeito com a resposta aceita, então criei alguns scripts para fazer isso por você, disponíveis no Github . Isso deve ajudar quem deseja usar, git svn clonemas não deseja clonar o repositório inteiro e não deseja procurar uma revisão específica para clonar no meio da história (talvez você esteja clonando um monte de repositórios). Aqui podemos apenas clonar as últimas N revisões:

Use git svn clonepara clonar as últimas 50 revisões

# -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

Encontre a revisão N anterior de um repositório SVN

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

./svn-lookback.sh -u https://server/project/trunk -l 5     
jonathan.cone
fonte
Vamos resolver isso, nosso repositório tem cerca de 170.000 revisões e está demorando demais para fazer um único projeto, e eu tenho mais de 10 projetos específicos no repositório para fazer: | Considerando apenas fazer 3-4 anos de história.
VeenarM
1
Obrigado por compartilhar isso!
Kai Mechel