2009-04-14 19 views
289

ProblemaCómo git-svn clona las últimas n revisiones desde un repositorio de Subversion?

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

El comando git clone puede obtener las últimas n revisiones de un repositorio de Git si utiliza 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 sólo he encontrado la opción -rN donde N es la revisión de tirar. 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 sustituyen HEAD~3 con el número real de la tercera, pero la última revisión 534. Eso funcionó, pero que requiere que yo primero averiguar el número de revisión de la tercera, pero la última confirmación.

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

Documentación

git-clone

git-svn

+1

lo que hace '-s' hacer aquí? –

+5

Respondiendo a mi propia pregunta: '-s es para --stdlayout que presume el diseño recomendado svn para etiquetas, troncales y ramas. ' (pero no funcionó para mí) –

+0

¿Qué tan difícil sería implementar' - -depth' para 'git svn', ya que el soporte ya está allí. ¿Y ya tiene que averiguar la última versión del servidor? –

Respuesta

211

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

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

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

+47

Eso es, por ejemplo, git svn clone -s -r1450: HEAD http: // some/svn/repo. –

+5

¿Qué sucede si deseo continuar clonando la revisión anterior en el futuro, es posible? – Zennichimaro

+5

@Zennichimaro: Puedes hacer eso agregando otro control remoto 'git-svn' apuntando al mismo lugar y usando' git-svn fetch' para obtener más del árbol. En ese punto, debe usar 'git filter-branch' para reparar el árbol viejo (parcial) en la rama derecha. –

83

Me encuentro utilizando lo siguiente a menudo para obtener un número limitado de revisiones de nuestro enorme árbol de subversión (pronto llegaremos a svn revisión 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 determinar dónde se originó una rama es hacer un svn log y encontrar el primero en la rama (la última que aparece cuando se hace):

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

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

+1

+1 de mí - me ayudó a resolver un problema de error 128 Estaba clonando todo un svn repo –

+0

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, así que generalmente creo un repositorio Git local para cada rama SVN, y luego 'cherry-pick' /' rebase' entre esos. Commit da un paso extra ('push', luego 'dcommit' desde el repositorio remoto), pero creo que vale la pena la compensación. – chronospoon

24

... 7 años más tarde, en el desierto, una planta rodadora sopla por ...

que no estaba satisfecho con la respuesta aceptada por lo que he creado algunos scripts para hacer esto para usted available on Github. Estos deberían ayudar a cualquiera que quiera usar git svn clone pero no quiere clonar todo el repositorio y no quiere buscar una revisión específica para clonar a partir de la mitad del historial (tal vez esté clonando un montón de repositorios) . Aquí sólo podemos clonar los últimos N revisiones:

Uso git svn clone para clonar los últimos 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 

Encuentra la anterior revisión N desde un repositorio SVN

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

./svn-lookback.sh -u https://server/project/trunk -l 5  
+0

Le dará una grieta, nuestro repositorio tiene aproximadamente 170,000 revisiones y está tardando demasiado en hacer un solo proyecto, y yo tengo más de 10 proyectos específicos en el repositorio para hacer: | Considerando solo hacer 3-4 años de historia solamente. – VeenarM

Cuestiones relacionadas