¿Cómo escapar de @ caracteres en los nombres de archivos administrados de Subversion?


191

Para muchas operaciones de Subversion, agregar el símbolo '@' al final de un archivo o argumento de URL le permite apuntar a una revisión específica de ese archivo. Por ejemplo, "svn info test.txt@1234" proporcionará información sobre test.txt tal como existía en la revisión 1234.

Sin embargo, cuando el nombre del archivo contiene una @, Subversion lo interpreta incorrectamente como un especificador de revisión:

svn info 'test @ .txt' svn: error de sintaxis al analizar la revisión '.txt'

He intentado comillas dobles y simples, así como escapar con '/', '\' y '@'. ¿Cómo puedo decirle a Subversion que trate los símbolos @ como parte del nombre del archivo?


3
¿Por qué demonios tienes nombres de archivo con @ en ellos? Pidiendo problemas, si me preguntas ... :-)
JesperE

Muy buena pregunta! :) Me estoy haciendo cargo de un proyecto donde este personaje es un componente fundamental de las convenciones de nomenclatura de archivos y desafortunadamente esto no se puede cambiar en un futuro próximo.
weston

57
Apple creó esta convención para todos sus desarrolladores de iOS a partir de iOS 4+. Todos los activos deben llamarse @ 2x si son para una pantalla de alta resolución ...
Dimitris

2
Estándar para el gueto antiguo Matlab OO
Chinasaur

Además, si guarda su clave privada o la clave de revocación de Enigmail de Thunderbird, crea un nombre de archivo, no irrazonablemente, dada la aplicación, que contiene un signo at
Peter Flynn

Respuestas:


283

Del libro SVN (énfasis agregado):

El lector perceptivo probablemente se esté preguntando en este punto si la sintaxis de revisión de clavijas causa problemas para trabajar con rutas de copia o URL que realmente tienen signos en ellas. Después de todo, ¿cómo sabe svn si news@11es el nombre de un directorio en mi árbol o simplemente una sintaxis para la "revisión 11 de las noticias "? Afortunadamente, aunque svn siempre asumirá lo último, hay una solución trivial. Solo necesita agregar un signo at al final de la ruta , como news@11@. svn solo se preocupa por el último en el inicio de sesión en el argumento, y no se considera ilegal omitir un especificador de revisión de peg literal después de eso en el inicio de sesión. Esta solución alternativa incluso se aplica a las rutas que terminan en un signo at; usted usaríafilename@@ para hablar sobre un archivo llamado nombre de archivo @ .


44
Tenga en cuenta que para usar "svn diff" necesita agregar un parámetro de revisión. "svn up @ file @" funciona, pero "svn diff @ file @" no funciona.
Debe

Nota para el libro SVN: los archivos pueden existir sin extensiones, incluso en Windows, por lo que también news@11podría ser un archivo.
trysis

1
Tenga en cuenta que para algunos comandos, como cambiar el nombre, un argumento puede ser un elemento versionado o un nombre de archivo local. En el caso de cambiar el nombre, el objetivo también se escanea en busca de una revisión anclada, pero luego puede tratarse como un nombre simple. Por ejemplo, si desea cambiar el nombre @fooa @bar, svn rename @foo@ @barse quejará @bar; pero si lo haces svn rename @foo@ @bar@, el nuevo nombre será literalmente @bar@. Para evitar esto, añadir ./(o .\ en las ventanas) para que quede claro que es una ruta local: svn rename @foo@ ./@bar.
Zastai

82

La respuesta original es correcta, pero quizás no lo suficientemente explícita. Las opciones particulares de la línea de comandos de Unix son las siguientes:

svn info 'image@2x.png@'

o

svn info "image@2x.png@"

o

svn info image\@2x.png\@

Acabo de probar los tres.


44
También probé svn info icon@2x.png@y funcionó también. ¡Sí, sin comillas ni barras!
Nate

La necesidad de las citas depende de su shell: utilizo KSH y seguro que necesita las comillas (ya que '@' es una señal de que desea que se ejecute un proceso en segundo plano). YMMV dependiendo de la cáscara.
David H

Sí. Mi kilometraje estaba en la bashcarretera :)
Nate

1
@Nate Ahora no puedo hacer que falle: funciona bien sin las comillas en ksh. No sé por qué pensaba que los he necesitado - tal vez algún otro problema - fue hace 2 años Me envió este ...
David H

14

Solución para agregar múltiples archivos en diferentes subcarpetas:

for file in $(find ./ -type f -name "*@*.png"); do svn add $file@; done

Simplemente reemplace el "png" en " @ .png" para el tipo de archivos que desea agregar.


asegúrese de citar o escapar de sus nombres de archivo (y hacer una coincidencia entre mayúsculas y minúsculas). También no hay necesidad de tratar con archivos @en su nombre como un caso especial, puede añadir con seguridad el @símbolo en todos los nombres de archivo: for file in $(find ./ -type f -iname "*.png"); do svn add "$file@"; done. Además, ¿este enfoque no deja su repositorio svn con una estructura de archivo / directorio inconsistente con la copia local de trabajo?
ardnew

el uso execde find podría ser más fácil:find . -type f -name "*@*.png" -exec svn add {}@ \;
Walty Yeung

11

para agregar el siguiente archivo: image@2x.png haga lo siguiente: svn add image \ @ 2x.png @


11

Simplemente agregue

@ @

en el archivo que necesita usar, sin importar qué comando SVN sea, por ejemplo:

file@2x.jpg

a

file@2x.jpg@

8

En mi caso, necesitaba eliminar archivos de un repositorio SVN que contenía un signo @:

Esto no funcionaría:

svn remove 'src/assets/images/hi_res/locales-usa@2x.png'

Pero esto hizo:

svn remove 'src/assets/images/hi_res/locales-usa@2x.png@'

6

Para agregar varios archivos, hay una solución alternativa:

svn status | grep \.png | awk '{print $2"@"}'| xargs svn add

Por favor explique su respuesta.
Hemang

3
Puede usar awk en lugar de grep:svn status | awk '/\.png/ {print $2"@"}'| xargs svn add
h3dkandi

1

Para los comandos svn con 2 argumentos como "mover", debe agregar "@" solo en el parámetro izquierdo (primero). Por ejemplo:

$ svn add README@txt@
A         README@txt

$ svn move README@txt@ README2@txt
A         README2@txt
D         README@txt


$ svn status
A       README2@txt

$ svn commit -m "blah"
Adding         README2@txt
Transmitting file data .
Committed revision 168.

$ svn delete README2@txt@
D         README2@txt

$ svn commit -m "blahblah"
*Deleting       README2@txt

Committed revision 169.

Esta línea es importante: $ svn move README @ txt @ README2 @ txt

Como puede ver, no necesitamos agregar "@" en "README2 @ txt"


0

@David H

Acabo de probar un comando similar sin escapar de los símbolos @ y todavía funciona bien

svn ci splash.png splash@2x.png@

Esto está en GNU bash, versión 3.2.48 (1) -release (x86_64-apple-darwin10.0) y svn 1.6.16


0

La única solución que funcionó para mí fue la misma sugerida por @NPike

svn revertir 'ruta / a / nombre de archivo @ ext @'


¿Estás seguro de que esta debería ser una nueva respuesta a la pregunta original? Esto debería ser un voto o comentario positivo
Nico Haase

lo siento, mi mal, no puedo agregar comentarios todavía
Jonyx4

0

Hoy tuve el problema con los nombres de archivo generados a partir de direcciones de correo electrónico (¡no es una muy buena idea!).

Solución, usando printfopciones de find, y expansión de shell

 svn add  $(find . -name "*@*.png" -printf "%p@ ")
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.