¿Cómo ignoro un directorio con SVN?

760

Acabo de comenzar a usar SVN, y tengo un directorio de caché que no necesito bajo control de fuente. ¿Cómo puedo ignorar todo el directorio / carpeta con SVN?

Estoy usando Versions y TextMate en OS X y línea de comandos.

Gilean
fuente
3
Pregunta similar respondida aquí [SVN checkout ignore folder] [1] [1]: stackoverflow.com/questions/192824/svn-checkout-ignore-folder
mloskot
Posible duplicado de ¿Cómo ignoro los archivos en Subversion? (No me importa demasiado en qué dirección va el duplicado; ninguno de los conjuntos de respuestas es obviamente mejor que el otro.)
Jeffrey Bosboom el

Respuestas:

796

Establezca la svn:ignorepropiedad del directorio principal:

svn propset svn:ignore dirname .

Si tiene que ignorar varias cosas, sepárelas con nuevas líneas en el valor de la propiedad. En ese caso, es más fácil editar el valor de la propiedad utilizando un editor externo:

svn propedit svn:ignore .
Jason Cohen
fuente
2
@Kouber: Su problema es que la expansión de shell no conoce svn: ignore las propiedades. Entonces, usando '*' como parámetro explicityl pasa tmp al comando commit. Pruebe algo como 'svn commit -m "Más acentos".
MarkusSchaber
44
Gracias por la respuesta. Pico como editor: svn propedit svn: ignore. --editor-cmd pico
hade
157
Nota: Esto no funcionará si el directorio ya está "en" svn. svn rm --keep-local dirnameprimero. (Mi producción de estadísticas de svn fue enorme y me topé con esto por un tiempo).
Erik Aronesty
10
Si desea ignorar más de un archivo / carpeta, agregue todos sus nombres a un archivo txt, una línea cada uno, y use la siguiente variante:svn propset svn:ignore -F file.txt .
petervaz
2
Ten cuidado de que te pones svn:ignorey no svn::ignorecomo yo lo hice. Puede establecer propiedades arbitrarias, por lo que esta última se establecerá en Aceptar, y podrá ver y editar la propiedad, pero no hará que SVN ignore los archivos que enumera.
Richard Turner
406

Aquí hay una estructura de directorio de ejemplo:

\project
    \source
    \cache
    \other

Cuando projectvea que su directorio de caché no se agrega y aparece como tal.

> svn st
M  source
?  cache

Para establecer la propiedad ignorar, haga

svn propset svn: ignora el caché.

donde svn:ignoreestá el nombre de la propiedad que está configurando, cacheel valor de la propiedad y .el directorio en el que está configurando esta propiedad. Debe ser el directorio principal del cachedirectorio que necesita la propiedad.

Para verificar qué propiedades están configuradas:

> svn proplist
Properties on '.':
  svn:ignore

Para ver el valor de svn:ignore:

> svn propget svn:ignore
cache

Para eliminar propiedades establecidas previamente:

svn propdel svn:ignore
craigb
fuente
17
Un punto complicado aquí que me tropecé. Asegúrese de no agregar una barra diagonal final a dirname. Por ejemplo, al escribir svn propset svn:ignore dirname, si permite que el shell (bash) complete el nombre del directorio por usted, agregará esa barra diagonal final, dejándolo con el comando svn propset svn:ignore dirname/, que no da como resultado que se ignore la carpeta. Al menos esa fue mi experiencia.
David Weinraub
44
El directorio 'caché' seguirá apareciendo en 'svn st'. ¿Hay alguna forma de eliminarlo de la vista? (sin eliminar del disco)
Tom Brito
131

Importante mencionar:

En la línea de comando no puedes usar

svn add *

Esto también agregará los archivos ignorados, porque la línea de comando se expande *y, por lo tanto, svn addcree que desea que se agreguen todos los archivos. Por lo tanto, use esto en su lugar:

svn add --force .
binco
fuente
haz exactamente lo que @binco dijo: svn add --force *NO funcionará. Usa el punto, no la estrella.
manuell
80

Como pasé un tiempo tratando de hacer que esto funcione, debe tenerse en cuenta que si los archivos ya existen en SVN, los necesita svn deletey luego edita la svn:ignorepropiedad.

Sé que parece obvio, pero siguieron apareciendo como ?en mi svn statuslista, cuando pensé que simplemente los ignoraría localmente.

Kai
fuente
8
No olvides usar la opción --keep-local cuando elimines los archivos si solo quieres ignorarlos y no eliminarlos.
Dylan Holmes
71

Para expandir ligeramente, si está haciendo esto con la herramienta de línea de comandos svn, desea escribir:

svn propedit svn:ignore path/to/dir

que abrirá el editor de texto de su elección, luego escriba '*' para ignorar todo lo que contiene y guardar + salir: esto incluirá el directorio en sí en svn, pero ignorará todos los archivos que contiene, para ignorar el directorio, use el ruta del padre y luego escriba el nombre del directorio en el archivo. Después de guardar, ejecute una actualización ('svn up') y luego verifique la ruta correspondiente.

Greg
fuente
8
Muy buen punto, gracias. Todas las demás respuestas perdieron el caso de directorios anidados. Entonces, en el ejemplo anterior (en funcionamiento), escriba el editor ignored_directory (que se supone que está un nivel por debajo de path / to / dir). Sin embargo, esto no funcionará: svn propedit svn: ignore. y luego escribiendo path / to / dir / ignored_directory en el editor. IOW: SVN hace coincidir objetos un nivel hacia abajo a la vez.
greenoldman
30

Establezca la svn:ignorepropiedad en el directorio principal:

$ cd parentdir
$ svn ps svn:ignore . 'cachedir'

Esto sobrescribirá cualquier valor actual de svn:ignore. Puede editar el valor con:

$ svn pe svn:ignore .

Lo cual abrirá tu editor. Puede agregar múltiples patrones, uno por línea.

Puede ver el valor actual con:

$ svn pg svn:ignore .

Si está utilizando una GUI, debe haber una opción de menú para hacerlo.

Frank Szczerba
fuente
3
svn ps svn:ignore . 'cachedir'resultados en cachedir is not under version control. cambiando a svn ps svn:ignore 'cachedir' .trabajado para mí
DiCaprio
21

Gracias por todas las contribuciones anteriores. Solo me gustaría compartir información adicional de mis experiencias al ignorar los archivos.


Cuando las carpetas ya están bajo control de revisión

Después de svn import y svn co los archivos, lo que solemos hacer por primera vez.

Todo el caché de tiempo de ejecución, las carpetas de archivos adjuntos estarán bajo control de versión. entonces, antes de svn ps svn: ignore , necesitamos eliminarlo del repositorio.

Con SVN versión 1.5 anterior podemos usar svn del --keep-local your_folder, pero para una versión anterior, mi solución es:

  1. svn exporta una copia limpia de tus carpetas (sin.svn carpeta oculta)
  2. svn del local y repositorio,
  3. svn ci
  4. Copia de nuevo las carpetas
  5. Do svn st y confirme que las carpetas están marcadas como '?'
  6. Ahora podemos hacer svn ps según las soluciones

Cuando necesitamos que se ignore más de una carpeta

  • En un directorio tengo dos carpetas que deben configurarse como svn:ignore
  • Si establecemos uno, el otro será eliminado.
  • Entonces nos preguntamos si necesitamos svn pe

svn penecesitará editar el archivo de texto, y puede usar este comando si es necesario para configurar su editor de texto usando vi :

export SVN_EDITOR=vi
  1. Con "o" puedes abrir una nueva línea
  2. Escriba todos los nombres de carpeta que desea ignorar
  3. Presione la tecla 'esc' para escapar del modo de edición
  4. Escribe ": wq" y luego presiona Enterpara guardar y salir

El archivo se ve simplemente así:

runtime
cache
attachments
assets
Elliot Yap
fuente
también puede usar svn propset svn:ignore -F .ignorethesefiles ., que usará el contenido del archivo. Me gusta mantenerlo cerca para que sepas lo que se ignora. Las ediciones requieren un conjunto de accesorios de seguimiento.
Gerard ONeill
20

Eliminarlo primero ...

Si su directorio fooya está bajo control de versiones, elimínelo primero con:

svn rm --keep-local foo

... luego ignora:

svn propset svn:ignore foo .
quemaduras mate
fuente
12

... y si desea ignorar más de un directorio (digamos build/ temp/y *.tmparchivos), puede hacerlo en dos pasos (ignorando las propiedades de ignorar primero y editar (vea otras respuestas aquí) o puede escribir algo como

svn propset svn:ignore "build
temp
*.tmp" .

en la línea de comando.

DerMike
fuente
12

Si está utilizando el cliente SVN particular TortoiseSVN , luego de confirmar, tiene la opción de hacer clic derecho en los elementos y seleccionar "Agregar a la lista de ignorados".

Michael Lang
fuente
9

El comando para ignorar múltiples entradas es un poco complicado y requiere barras diagonales inversas.

svn propset svn:ignore "cache\
tmp\
null\
and_so_on" .

Este comando ignorar todo lo nombrado cache, tmp, null, y and_so_onen el directorio actual.

James Stroud
fuente
66
Y solo para aclarar: la barra invertida aquí no es una característica de svn; es simplemente una forma de ingresar una cadena de varias líneas en el shell. También puede usar un editor y simplemente escribir varias líneas.
sleske
La barra invertida no es necesaria para bash. bash es lo suficientemente inteligente como para saber que un "está abierto y no para procesar la línea. Todo lo que necesita hacer es presionar enter después de caché, tmp y nulo. Verá que bash cambia la solicitud a> para que sepa todavía están ingresando el comando. Una alternativa es comenzar a escribir el comando (svn), luego presionar esc y luego v. Eso le permitirá ingresar el comando en el editor. Presione ZZ cuando termine para ejecutar el comando. si cambia de opinión y no quiero ejecutar, entonces: q !.
Michael Potter
1
svn propset svn:ignore -F .ignorethesefiles .le permitirá usar un archivo. Y como se mencionó, siempre has sido propendido.
Gerard ONeill
5

Tuve problemas para ignorar los directorios anidados; el directorio superior que quería ignorar no se mostraba con 'svn status' pero todos los subdirectos sí. Probablemente esto sea evidente para todos los demás, pero pensé en compartirlo:

EJEMPLO:

/maletero

/ trunk / cache

/ trunk / cache / subdir1

/ trunk / cache / subdir2

cd /trunk
svn ps svn:ignore . /cache
cd /trunk/cache
svn ps svn:ignore . *
svn ci
brainycat
fuente
4

"Gracias" svn por una forma tan horrible, falsa y difícil de ignorar los archivos.

Entonces escribí un script svn-ignore-all :

#!/bin/sh

# svn-ignore-all

# usage: 
#   1. run svn status to see what is going on at each step 
#   2. add or commit all files that you DO want to have in svn
#   3. remove any random files that you don't want to svn:ignore
#   4. run this script to svn:ignore everything marked '?' in output of `svn status`

svn status |
grep '^?' |
sed 's/^? *//' |
while read f; do
    d=`dirname "$f"`
    b=`basename "$f"`
    ignore=`svn propget svn:ignore "$d"`
    if [ -n "$ignore" ]; then
        ignore="$ignore
"
    fi
    ignore="$ignore$b"
    svn propset svn:ignore "$ignore" "$d"
done

Además, para ignorar la lista específica de archivos / nombres de ruta, podemos usar esta variante svn-ignore . Supongo que svn-ignore-all debería ser realmente como xargs svn-ignore.

#!/bin/sh

# svn-ignore

# usage:
#   svn-ignore file/to/ignore ...

for f; do
    d=`dirname "$f"`
    b=`basename "$f"`
    ignore=`svn propget svn:ignore "$d"`
    if [ -n "$ignore" ]; then
        ignore="$ignore
"
    fi
    ignore="$ignore$b"
    svn propset svn:ignore "$ignore" "$d"
done

Una cosa más: tiendo a contaminar mis pagos de svn con muchos archivos aleatorios. Cuando es hora de comprometerse, muevo esos archivos a un subdirectorio 'viejo' y le digo a svn que ignore 'viejo'.

Sam Watkins
fuente
Hola Sam, ese es un lindo guión. La pregunta surgió en mi cabeza: ¿es quizás que el problema proviene del hecho de que ignorar una carpeta completa que es parte del repositorio no funciona, por lo que terminamos con esos '?' archivos que son básicamente archivos modificados en carpetas que agregamos a la lista de ignorados? Me pregunto si hay una forma de evitar su script, ya que sería tedioso ejecutarlo todo el tiempo. ¿Vos si?
SquareCat
no, realmente no lo uso! solo trato de limpiar mis archivos
Sam Watkins
4

Bash oneliner para ignoraciones múltiples:

svn propset svn:ignore ".project"$'\n'".settings"$'\n'".buildpath" "yourpath"
Fedir RYKHTIK
fuente
3

Si su directorio de proyecto se llama / Project, y su directorio de caché se llama / Project / Cache, entonces necesita establecer una propiedad de subversión en / Project. El nombre de la propiedad debe ser "svn: ignore" y el valor de la propiedad debe ser "Caché".

Consulte esta página en el manual de Subversion para obtener más información sobre las propiedades.

El gabeg digital
fuente
3

La respuesta de Jason hará el truco. Sin embargo, en lugar de establecer svn: ignore a "." en el directorio de caché, es posible que desee incluir "caché" en la propiedad svn: ignore del directorio principal , en caso de que el directorio de caché no siempre esté presente. Hago esto en varias carpetas "desechables".

harpo
fuente
3

PARA MANTENER LOS DIRECTORIOS QUE SVN IGNORARÁ:

  1. esto eliminará los archivos del repositorio, pero mantendrá el directorio bajo control SVN:

svn delete --keep-local path / directory_to_keep / *

  1. luego configure para ignorar el directorio (y todo el contenido):

svn propset svn: ignora la ruta "*" / directorio_a_ mantenimiento

sheasie
fuente
2

Si está utilizando una interfaz para SVN como TortoiseSVN, o algún tipo de integración IDE, también debería haber una opción de ignorar en el mismo menú que la operación de confirmación / agregar.

Chris Marasti-Georg
fuente
1

Establezca la propiedad svn: ignore . La mayoría de las herramientas de interfaz de usuario tienen una manera de hacer esto, así como la discusión de la línea de comando en el enlace.

Joe Skora
fuente
1

Como estás usando versiones, en realidad es muy fácil:

  • Explore su copia desprotegida
  • Haga clic en el directorio para ignorar
  • En el cuadro "Ignorar a la derecha, haga clic en Editar
  • Escriba *. * Para ignorar todos los archivos (o * .jpg solo para archivos jpg, etc.)
Andrés
fuente
1

Observe sus barras diagonales también. Descubrí que incluir images/*en mi archivo de configuración de ignorar no ignoraba ./images/. Cuando corrí svn status -u, todavía se notaba ? images. Entonces, simplemente cambié la configuración de ignorar a solo images, sin barras. Realicé una verificación de estado y eso lo borró.

cdmo
fuente
1

Resuelto con Eclipse de la siguiente manera:

En primer lugar, sincronice su carpeta con el proyecto:

equipo -> sincronizar

En la siguiente vista, vista de equipo, puede ver todos los recursos que puede asignar al servidor SVN.

Por lo tanto, seleccione la carpeta de recursos del recurso que desea ignorar, y luego puede ignorarlo usando

equipo -> agregar a svn:ignore.

Después de eso, en la ventana de confirmación, seleccione la primera opción: "ignorar por nombre".

Por ejemplo, si quiero ignorar la carpeta de destino y sus recursos .class, sincronizaré y, en la vista de sincronización, seleccionaré la carpeta de destino. Después de eso, seleccionaré

equipo-> agregar

ay svn:ignoreluego confirmaré la primera opción en la ventana de confirmación.

Antonio Martin
fuente
0

Después de perder mucho tiempo buscando cómo hacer esta simple actividad, decidí publicar que no fue difícil encontrar una explicación decente.

Primero deje que la estructura de la muestra

$ svn st? proyecto / tronco / objetivo? proyecto / trunk / myfile.x

1 - primero configure el editor, en mycase vim export SVN_EDITOR = vim

2 - "svn propedit svn: ignore project / trunk /" abrirá un nuevo archivo y puede agregar sus archivos y subdirectorio en nuestro caso, escriba "target" guardar y cerrar el archivo y funciona

$ svn st? proyecto / trunk / myfile.x

Gracias.

Bruno Lee
fuente