¿Cómo git-svn clonar las últimas n revisiones de un repositorio de Subversion?

314

Problema

¿Cómo se crea una copia superficial con git-svn desde un repositorio de Subversion, por ejemplo, cómo extrae solo las últimas tres revisiones?

El git clonecomando puede obtener las últimas n revisiones de un repositorio de Git si usa la opción --depth, es decir, obtiene una copia superficial del repositorio. Ejemplo:

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

¿Hay una opción similar para git-svn?

Mis descubrimientos hasta ahora

Hasta ahora solo he encontrado la -rNopción donde Nestá la revisión para extraer. Ejemplo:

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

Según la documentación existe la posibilidad de utilizar -r$REVNUMBER:HEAD. Intenté lo siguiente para obtener las últimas 3 revisiones que devolvieron un mensaje de error.

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

Así que lo reemplacé HEAD~3con el número real de la tercera pero última revisión 534. Eso funcionó, pero eso requiere que primero averigüe el número de revisión de la tercera pero última confirmación.

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

Documentación

git-clone

git-svn

Lernkurve
fuente
66
Respondiendo a mi propia pregunta: -s is for --stdlayout which presumes the svn recommended layout for tags, trunk, and branches.(pero no funcionó para mí)
Sebastián Grignoli
¿Qué tan difícil sería para poner en práctica --depthpara git svn, ya que el apoyo que ya está ahí. ¿Y ya tiene que averiguar las últimas revoluciones del servidor?
Peter Cordes

Respuestas:

238

Ya ha descubierto la forma más sencilla de especificar un clon superficial en Git-SVN, especificando el número de revisión de SVN en el que desea iniciar su clon ( -r$REV:HEAD).

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

La estructura de datos de Git se basa en punteros en un gráfico acíclico dirigido (DAG), lo que hace que sea trivial retroceder los ncommits. Pero en SVN (y, por lo tanto, en Git-SVN) tendrá que encontrar el número de revisión usted mismo.

Pablo
fuente
55
¿Qué pasa si me gustaría continuar clonando la revisión anterior en el futuro? ¿Es posible?
Zennichimaro
55
@Zennichimaro: Puede hacerlo agregando otro git-svnpuntero remoto al mismo lugar y usando git-svn fetchpara obtener más del árbol. En ese punto, debe usar git filter-branchpara volver a pintar el árbol viejo (parcial) en la rama derecha.
Ben Jackson
Paul tiene alguna forma de obtener las últimas revisiones realizando Migración incremental de SVN a Git ( stackoverflow.com/questions/29161646/… )
SabareeshSS
1
SVN usa números enteros consecutivos para identificar revisiones, lo que hace que sea aún más trivial n
anular las
Creo que falta un espacio después de -r. Por ejemplo, git svn clone -r 1133: HEAD some / svn / repo
Gnana
92

Me encuentro usando lo siguiente a menudo para obtener un número limitado de revisiones de nuestro enorme árbol de subversión (pronto llegaremos a svn revision 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

Y una buena manera de averiguar dónde comenzó una rama es hacerlo svn logy encontrar la primera en la rama (la última que aparece al hacer):

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

Hasta ahora no he encontrado realmente la molestia de rastrear todas las ramas. Se necesita demasiado tiempo para clonar y svn y git no funcionan juntos tan bien como me gustaría. Tiendo a crear archivos de parches y aplicarlos en el clon git de otra rama svn.

cristiano
fuente
1
+1 de mi parte - me ayudó a resolver un problema de error 128 que estaba clonando un repositorio svn completo
Ian Oxley
¡El comando svn log era exactamente lo que estaba buscando! gracias
mrbrdo
1
Los repositorios con los que trabajo tienen ramificaciones y diseños no estándar, por lo que generalmente creo un repositorio Git local para cada rama SVN, y luego cherry-pick/ rebaseentre ellos. Commit toma un paso adicional ( push, luego, dcommitdesde un repositorio remoto), pero creo que vale la pena la compensación.
Cronospoon
No había pensado en eso, podría ser más rápido simplemente clonando etiquetas / ramas específicas como usted dice :)
VeenarM
34

... 7 años después, en el desierto, una planta rodadora sopla ...

No estaba satisfecho con la respuesta aceptada, así que creé algunos scripts para hacer esto disponible en Github . Esto debería ayudar a cualquiera que quiera usar git svn clonepero no quiera clonar todo el repositorio y no quiera buscar una revisión específica para clonar desde la mitad de la historia (tal vez esté clonando un montón de repositorios). Aquí podemos clonar las últimas N revisiones:

Use git svn clonepara clonar las últimas 50 revisiones

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

Encuentre la revisión N anterior de un repositorio SVN

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

./svn-lookback.sh -u https://server/project/trunk -l 5     
jonathan.cone
fuente
Le daremos una oportunidad, nuestro repositorio tiene aproximadamente 170,000 revisiones y está tardando demasiado en hacer un solo proyecto, y tengo más de 10 proyectos específicos en el repositorio para hacer: | Considerando solo hacer 3-4 años de historia solamente.
VeenarM
1
¡Gracias por compartir esto!
Kai Mechel