Extraiga un archivo de Subversion

320

"No es posible extraer un solo archivo. El mejor nivel de pago que puedes hacer es en el nivel de directorio".

¿Cómo puedo solucionar este problema cuando uso Subversion?

Tenemos esta carpeta en Subversion donde guardamos todas nuestras imágenes. Solo quiero ver un archivo (imagen) de eso. Esta carpeta es realmente grande y tiene muchas otras cosas que no necesito ahora.

bluegene
fuente
Puedes hacerlo de la otra manera. Inicie sesión en el servidor de producción y svn upen su directorio local en su computadora.
Neocortex

Respuestas:

403

La respuesta simple es que usted svn exportel archivo en lugar de verificarlo.

Pero eso podría no ser lo que quieres. Es posible que desee trabajar en el archivo y volver a ingresarlo, sin tener que descargar GB de basura que no necesita.

Si tiene Subversion 1.5+, haga un pago escaso:

svn checkout <url_of_big_dir> <target> --depth empty
cd <target>
svn up <file_you_want>

Para una versión anterior de SVN, puede beneficiarse de lo siguiente:

  • Verifique el directorio utilizando una revisión en el pasado distante, cuando no estaba tan lleno de basura que no necesita.
  • Actualice el archivo que desee para crear una revisión mixta. Esto funciona incluso si el archivo no existía en la revisión que retiró.
  • ¡Lucro!

Una alternativa (por ejemplo, si el directorio tiene demasiada basura desde la revisión en la que se creó) es hacer una copia de URL-> URL del archivo que desea en un nuevo lugar en el repositorio (efectivamente, esta es una rama de trabajo del archivo). Echa un vistazo a ese directorio y haz tus modificaciones.

No estoy seguro de si puede fusionar su copia modificada por completo en el repositorio sin una copia de trabajo del destino; nunca lo he necesitado. Si es así, haz eso.

Si no es así, desafortunadamente puede que tenga que encontrar a otra persona que tenga todo el directorio desprotegido y hacer que lo hagan. O tal vez para cuando haya hecho sus modificaciones, el resto habrá terminado de descargar ...

Steve Jessop
fuente
13
La solución realmente simple es acceder al repositorio con un navegador web.
dolmen
11
@dolmen: suponiendo que no sea necesario modificar el archivo, tal vez (y suponiendo que se esté ejecutando una interfaz web para ese repositorio). Utilizo SVN de línea de comandos, así que para mí, es más fácil de usar svn exportque usar la interfaz web, si sé qué archivo quiero. El interrogador ya usa SVN, así que supongo que depende de qué cliente y si ese cliente lo hace fácil de usar svn export. Sin svn lsembargo, encuentro la interfaz web mejor para navegar que :-)
Steve Jessop
2
SmartSVN Client bloqueará archivos individuales si su servidor de Subversion lo admite. Y hay ganchos que requieren desprotecciones deben hacerse antes de que un archivo binario / ejecutable pueda registrarse. Realmente no tiene sentido que dos personas modifiquen una multa binaria y fusionen esos cambios. Estas pueden ser nuevas funciones que no estaban disponibles cuando se hizo esta pregunta.
TamusJRoyce
@Tamus: "Realmente no tiene sentido" acordó, pero en los casos que describo la fusión es solo para que la nueva versión vuelva a la ubicación original. No se espera que el archivo binario se haya modificado en el destino de la fusión. Por lo tanto, el archivo en sí no necesita ninguna "fusión" más allá de reemplazar la versión anterior por la nueva, es solo lo que SVN lo llama y registra de dónde provienen los cambios para referencia futura. Tienes razón, la evitación de conflictos podría hacerse cumplir bloqueando el archivo durante el tiempo que sea necesario.
Steve Jessop
1
TortoiseSVN puede verificar archivos individuales. Creo que hace lo mismo detrás de escena para lograrlo.
Mike Starov
109

Intenta en svn exportlugar de svn checkout. Eso funciona para archivos individuales.

La razón de la limitación es que checkoutcrea una copia de trabajo, que contiene metainformación sobre repositorio, revisión, atributos, etc. Esos metadatos se almacenan en subdirectorios llamados '.svn'. Y los archivos individuales no tienen subdirectorios.

Mnementh
fuente
2
Advertencia: las versiones extremadamente antiguas de svnno harán exportaciones de archivos individuales.
Mladen Jablanović
55
Este es el método superior si solo desea obtener la última versión de un script en particular como parte de una implementación, o algo así.
william.berg
2
Esa advertencia fue exagerada incluso en 2011, pero las versiones extremadamente antiguas pueden funcionar svn cat $url_to_file_in_repo > $local_file_name.
cprn
53

Use svn cato svn export.

Para eso, no necesita buscar el directorio de trabajo, pero no podrá confirmar los cambios que realice. Si necesita hacer cambios y confirmarlos, necesita un directorio de trabajo, pero no tiene que buscarlo por completo. Verifique la revisión donde el directorio todavía estaba / casi vacío, y luego use 'svn cat' para extraer el archivo de HEAD.

Milan Babuškov
fuente
svn cat svn://.../my_file.txtera exactamente lo que estaba buscando. Trabajo en un svn://único (no http://) repositorio, y parece que las interfaces websvn más nuevas no proporcionan una descarga de archivos sin formato (o tenemos una configuración incorrecta o estoy ciego). Es más fácil hacerlo de esta manera que checkout+ upsolo para descargar un archivo.
ribamar
12

Si desea ver readme.txt en su repositorio sin verificarlo:

$ svn cat http://svn.red-bean.com/repos/test/readme.txt
Este es un archivo README. Deberías leer esto.

Consejo: Si su copia de trabajo está desactualizada (o tiene modificaciones locales) y desea ver la revisión HEAD de un archivo en su copia de trabajo, svn cat buscará automáticamente la revisión HEAD cuando le dé una ruta:

$ cat foo.c
Este archivo está en mi copia de trabajo local y tiene cambios que he realizado.

$ svn cat foo.c ¡
Última revisión recién salido del repositorio!

Fuente

GEOCHET
fuente
También puede usar directamente cualquier cliente HTTP. Su navegador web o una herramienta de línea de comandos como curlo wget.
dolmen
9

A continuación, se presenta una solución equivalente a TortoiseSVN de la respuesta aceptada (lo había escrito en un documento interno para mi empresa, ya que estamos adoptando SVN recientemente). Pensé que sería útil compartir aquí también:

Extracción de un solo archivo: Subversion no admite la extracción de un solo archivo, solo admite la extracción de estructuras de directorios. (Referencia: http://subversion.tigris.org/faq.html#single-file-checkout ). Esto se debe a que con cada directorio que se extrae como una copia de trabajo, los metadatos relacionados con modificaciones / revisiones de archivos se almacenan como una carpeta interna oculta (.svn / _svn). Actualmente, esto no es compatible (v1.6) para archivos individuales.

Estrategia alternativa recomendada: deberá realizar la parte del directorio de pago solo una vez, luego podrá ir directamente a sus archivos individuales. Haga un pago escaso de la carpeta principal y la estructura del directorio. Básicamente, un proceso de pago escaso es verificar solo la estructura de carpetas sin llenar los archivos de contenido. Por lo tanto, solo revisa las estructuras de directorio y no necesita revisar TODOS los archivos como era la preocupación. Referencia: http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-checkout.html

Paso 1 : proceder al navegador del repositorio

Paso 2 : haga clic derecho en la carpeta principal dentro del repositorio que contiene todos los archivos en los que desea trabajar y seleccione Finalizar compra.

Paso 3 : dentro de una nueva ventana emergente, asegúrese de que el directorio de pago apunte a la ubicación correcta en su PC local. También habrá un menú desplegable con la etiqueta "profundidad de pago". Elija "Solo este elemento" o "Niños inmediatos, incluidas las carpetas", según sus requisitos. Se recomienda la segunda opción ya que, si desea trabajar en una carpeta anidada, puede continuar directamente la próxima vez, de lo contrario deberá seguir todo este procedimiento nuevamente para la carpeta anidada.

Paso 4 : las carpetas principales ahora deberían estar disponibles dentro de la carpeta elegida localmente y ahora se está monitoreando con SVN (una carpeta oculta ".svn" o "_svn" ahora debería estar presente). Dentro del repositorio ahora, haga clic con el botón derecho en el archivo único que desea extraer solo y seleccione la opción "Actualizar elemento a revisión". El archivo único ahora se puede trabajar y volver a registrar en el repositorio.

Espero que esto ayude.

Kaushik Gopal
fuente
8

Puedes hacerlo en dos pasos:

  1. Verifique un repositorio SVN vacío solo con metainformación:

    $ cd /tmp
    
    $ svn co --depth empty http://svn.your.company.ca/training/trunk/sql
    
  2. Ejecutar svn uppara actualizar el archivo especificado:

    $ svn up http://svn.your.company.ca/training/trunk/sql/showSID.sql
    
usuario2920375
fuente
6

Una actualización en caso de que lo que realmente necesita pueda cubrirse al incluir el archivo en el pago de otra carpeta.

Desde SVN 1.6 puede crear archivos externos , una especie de enlaces svn. Significa que puede tener otra carpeta versionada que incluya un solo archivo. También es posible realizar cambios en el archivo en el pago de esta carpeta.

Es muy simple, verifique la carpeta en la que desea incluir el archivo y simplemente agregue una propiedad a la carpeta

svn propedit svn:externals .

con contenido como este:

file.txt /repos/path/to/file.txt

Después de confirmar esto, el archivo aparecerá en futuros pagos de la carpeta. Básicamente funciona, pero hay algunas limitaciones como se describe en la documentación vinculada anteriormente.

Blanne
fuente
4

Vaya al navegador de repositorios, haga clic con el botón derecho en el archivo y use 'Guardar como', aunque estoy usando TortoiseSVN.

Dave Anderson
fuente
4
cd C:\path\dir
svn checkout https://server/path/to/trunk/dir/dir/parent_dir--depth empty
cd C:\path\dir\parent_dir
svn update filename.log

(Editar nombredearchivo.log)

svn commit -m "this is a comment."
anon
fuente
4

La respuesta de Steve Jessop no funcionó para mí. Leí los archivos de ayuda para SVN y si solo tienes una imagen, probablemente no quieras volver a ingresarla a menos que estés haciendo Photoshop, así que exporta es un comando mejor que pagar ya que no está versionado (pero eso es menor).

Y --depth ARG no debe estar vacío, sino archivos para obtener los archivos en el directorio inmediato. Entonces obtendrá todos los campos, no solo el uno, pero vacío no devuelve nada del repositorio.

 svn co --depth files <source> <local dest>

o

svn export --depth files <source> <local dest>

En cuanto a las otras respuestas, cat le permite leer el contenido que es bueno solo para texto, no imágenes de todas las cosas.

Vass
fuente
1
El punto --depth emptyera que los otros archivos no deberían ser desprotegidos, y luego puede obtener un solo archivo con svn up <source/file>. Con svn export, no hay necesidad de hacer esto, solo especifique el archivo.
Kevin Vermeer el
@reemrevnivek: tienes razón. bueno, la pregunta solo pedía un solo archivo, esto funciona sin la extracción de todo el archivo de estructura de directorios, incluso si está vacío.
Vass
4

Simplemente lo examinaría y exportaría el archivo único. Si tiene acceso HTTP, simplemente use el navegador web para encontrar el archivo y agarrarlo.

Si necesita recuperarlo después de editarlo, eso podría ser un poco más tedioso, pero estoy seguro de que podría haber una svn importfunción ...

Oli
fuente
3

Haz algo como esto:

mkdir <your directory>/repos/test

svn cat http://svn.red-bean.com/repos/test/readme.txt > <your directory>/repos/test/readme.txt

Básicamente, la idea es crear el directorio donde desea obtener el archivo de SVN. Use el svn catcomando y redirija la salida al mismo archivo con nombre. Por defecto, el gato volcará la información en stdio.

Manish Singh
fuente
2

Si solo desea un archivo sin información de revisión, use

svn export <URL>
Ted
fuente
2

Con Subversion 1.5, es posible extraer (todos) los archivos de un directorio sin verificar ningún subdirectorio (los diversos indicadores --depth). No es exactamente lo que pediste, sino una forma de "menos que todo".

jackr
fuente
2

Usando la técnica de verificación escasa, PUEDES revisar un archivo en particular que ya está desprotegido o existe ... con un simple truco:

Después de pagar el nivel superior de su repositorio utilizando la opción 'solo este elemento', en el explorador de Windows, primero DEBE hacer clic derecho en el archivo que necesita actualizar; elija Repo Browser en el menú contextual; encuentre ese archivo OTRA VEZ en el navegador del repositorio y haga clic con el botón derecho. Ahora debería ver el "elemento de actualización a revisión" en el menú contextual.

No estoy seguro de si es una característica no documentada o simplemente un error. Me tomó muchas horas después del trabajo encontrar finalmente este truco. Estoy usando TortoiseSVN 1.6.2.

devXen
fuente
2

Quería retirar un solo archivo a un directorio, que no era parte de una copia de trabajo.

Consigamos el archivo en la siguiente URL: http: //subversion.repository.server/repository/module/directory/myfile

svn co  http://subversion.repository.server/repository/module/directory/myfile /**directoryb**

Así que verifiqué el directorio dado que contiene el archivo de destino que quería acceder a un directorio ficticio (por ejemplo, etc. para la URL que termina con /etc).

Luego vacié el archivo .svn / Entradas de todos los archivos del directorio de destino que no necesitaba, para dejar solo el archivo que quería. En este .svn / entradas archivo , tiene un registro para cada archivo con sus atributos, así que deje solo el registro relativo al archivo que desea obtener y guardar.

Ahora solo necesita copiar y luego '' .svn '' en el directorio que será una nueva "copia de trabajo". Entonces solo necesitas:

cp .svn /directory
cd /directory
svn update myfile

Ahora el directorio del directorio está bajo control de versiones. No olvide eliminar el directorio directoriob que era solo una "copia de trabajo temporal".

Hendergassler
fuente
¿No es esto lo que hace el pago escaso? Realmente no deberías hackear los archivos en el directorio .svn manualmente.
Lasse V. Karlsen
Quizás pero resolvió el problema correctamente. Supongo que es la forma en que debería funcionar la gestión de versiones, también es capaz de manejar archivos como extensión de directorios. Pruébalo y dime qué tiene de malo la lógica. Sugeriría al equipo de desarrollo de subversion que extienda la utilidad svn con esta característica, resolvería los problemas de todos los que respondieron a este hilo.
Hendergassler
2

Como ninguna de las otras respuestas funcionó para mí, lo hice usando este truco:

$ cd /yourfolder
svn co https://path-to-folder-which-has-your-files/ --depth files

Esto creará una nueva carpeta local que solo tiene los archivos de la ruta remota. Luego puede hacer un enlace simbólico a los archivos que desea tener aquí.

Lacho Tomov
fuente
El OP preguntó acerca svn code un archivo para evitar un directorio completo lleno de archivos de imagen. Además, agregar un enlace simbólico solo puede aumentar la complejidad, moverse de un directorio temporal podría funcionar, pero aún así debe revisar todo el directorio de imágenes para una sola imagen. @ steve-jessop tuvo la idea correcta
Chris Marotta
2
@ChrisMarotta el OP hizo la pregunta hace 9 años. Nadie aquí está respondiendo el OP. Este es un tema general para este tipo de problema, y ​​ya no tiene nada que ver con el OP original. La gente viene aquí para encontrar una solución a su propio problema. Y cuando lo lean, algunos de ellos estarán en mi situación donde esta fue la única solución adecuada. Por eso lo publiqué.
Lacho Tomov
1
Estoy feliz por esta respuesta, me ayudó
Leos Literak
1

Este problema está cubierto por:

http://subversion.tigris.org/issues/show_bug.cgi?id=823

Hay un script adjunto que le permite verificar un solo archivo desde svn, realizar cambios y confirmar los cambios en el repositorio, pero no puede ejecutar "svn up" para verificar el resto del directorio. Ha sido probado con svn-1.3, 1.4 y 1.6.

ddkilzer
fuente
1

Si solo desea exportar el archivo, y no necesitará actualizarlo más tarde, puede hacerlo sin tener que usar comandos SVN.

Usando TortoiseSVN Repository Browser , seleccione el archivo, haga clic derecho y luego seleccione " Copiar URL al portapapeles ". Pegue esa URL en su navegador y, después de iniciar sesión, se le pedirá que descargue el archivo.

De esta manera, también puede seleccionar la revisión deseada y descargar una versión anterior del archivo.

Tenga en cuenta que esto es válido si su servidor SVN tiene una interfaz web.

Daniel
fuente