¿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?

Weston
fuente
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 @ .

Rob Kennedy
fuente
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 '[email protected]@'

o

svn info "[email protected]@"

o

svn info image\@2x.png\@

Acabo de probar los tres.

David H
fuente
44
También probé svn info [email protected]@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.

Lcsky
fuente
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: [email protected] haga lo siguiente: svn add image \ @ 2x.png @

Malek Belkahla
fuente
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/[email protected]'

Pero esto hizo:

svn remove 'src/assets/images/hi_res/[email protected]@'
NPike
fuente
6

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

svn status | grep \.png | awk '{print $2"@"}'| xargs svn add
liruqi
fuente
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"

Srdjan
fuente
0

@David H

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

svn ci splash.png [email protected]@

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

Qazzian
fuente
0

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

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

Jonyx4
fuente
¿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@ ")
Michel Billaud
fuente