¿Cómo ignoro los archivos en Subversion?

645

¿Cómo ignoro los archivos en Subversion?

Además, ¿cómo encuentro archivos que no están bajo control de versiones?

andyuk
fuente
Es divertido ver cómo cada pregunta simple (probablemente de un usuario de git) significa muchas respuestas demasiado complicadas. Si esto sucede, eso es Subversion baby.
Valerio Bozz

Respuestas:

738

(Esta respuesta se ha actualizado para que coincida con el comportamiento de SVN 1.8 y 1.9)

Tienes 2 preguntas:

Marcar archivos como ignorados:

Por "archivo ignorado" quiero decir que el archivo no aparecerá en las listas incluso como "no versionado": su cliente SVN fingirá que el archivo no existe en absoluto en el sistema de archivos.

Los archivos ignorados se especifican mediante un "patrón de archivo". La sintaxis y el formato de los patrones de archivo se explican en la documentación en línea de SVN: http://svnbook.red-bean.com/nightly/en/svn.advanced.props.special.ignore.html "Patrones de archivos en Subversion".

Subversion, a partir de la versión 1.8 (junio de 2013) y posteriores, admite 3 formas diferentes de especificar patrones de archivo. Aquí hay un resumen con ejemplos:

1 - Área de configuración de tiempo de ejecución - global-ignoresopción:

  • Esta es una configuración solo del lado del cliente , por lo que su global-ignoreslista no será compartida por otros usuarios, y se aplica a todos los repositorios que realice en su computadora.
  • Esta configuración se define en el archivo del Área de configuración de tiempo de ejecución:
    • Windows (basado en archivos) - C:\Users\{you}\AppData\Roaming\Subversion\config
    • Windows (basado en el registro) - Software\Tigris.org\Subversion\Config\Miscellany\global-ignoresen ambos HKLMy HKCU.
    • Linux / Unix - ~/.subversion/config

2 - La svn:ignorepropiedad, que se establece en directorios (no archivos):

  • Esto se almacena dentro del repositorio, por lo que otros usuarios tendrán los mismos archivos de ignorar. Similar a cómo .gitignorefunciona.
  • svn:ignorese aplica a directorios y no es recursivo ni se hereda. Se excluirá cualquier archivo o subdirectorio inmediato del directorio principal que coincida con el Patrón de archivo.
  • Si bien SVN 1.8 agrega el concepto de "propiedades heredadas", la svn:ignorepropiedad misma se ignora en los directorios descendientes no inmediatos:

    cd ~/myRepoRoot                             # Open an existing repo.
    echo "foo" > "ignoreThis.txt"                # Create a file called "ignoreThis.txt".
    
    svn status                                  # Check to see if the file is ignored or not.
    > ?    ./ignoreThis.txt
    > 1 unversioned file                        # ...it is NOT currently ignored.
    
    svn propset svn:ignore "ignoreThis.txt" .   # Apply the svn:ignore property to the "myRepoRoot" directory.
    svn status
    > 0 unversioned files                       # ...but now the file is ignored!
    
    cd subdirectory                             # now open a subdirectory.
    echo "foo" > "ignoreThis.txt"                # create another file named "ignoreThis.txt".
    
    svn status
    > ?    ./subdirectory/ignoreThis.txt        # ...and is is NOT ignored!
    > 1 unversioned file
    

    (Por lo tanto, el archivo ./subdirectory/ignoreThisno se ignora, aunque " ignoreThis.txt" se aplique en la .raíz del repositorio).

  • Por lo tanto, para aplicar una lista de ignorados de forma recursiva debe usar svn propset svn:ignore <filePattern> . --recursive.

    • Esto creará una copia de la propiedad en cada subdirectorio.
    • Si el <filePattern>valor es diferente en un directorio hijo, entonces el valor del niño anula completamente a los padres, por lo que no hay un efecto "aditivo".
    • Entonces, si cambia el <filePattern>en la raíz ., debe cambiarlo --recursivepara sobrescribirlo en los directorios hijo y descendiente.
  • Observo que la sintaxis de la línea de comandos es contra intuitiva.

    • Comencé asumiendo que ignorarías un archivo en SVN escribiendo algo como, svn ignore pathToFileToIgnore.txtsin embargo, esta no es la forma en que funciona la función de ignorar SVN.

3- La svn:global-ignorespropiedad. Requiere SVN 1.8 (junio de 2013):

  • Esto es similar a svn:ignore, excepto que hace uso de la característica "propiedades heredadas" de SVN 1.8.
  • Compare con svn:ignore, el patrón de archivo se aplica automáticamente en cada directorio descendiente (no solo en los elementos secundarios inmediatos).
    • Esto significa que no es necesario configurarlo svn:global-ignorescon el --recursiveindicador, ya que los patrones de ignorar heredados se aplican automáticamente a medida que se heredan.
  • Ejecutando el mismo conjunto de comandos que en el ejemplo anterior, pero usando en su svn:global-ignoreslugar:

    cd ~/myRepoRoot                                    # Open an existing repo
    echo "foo" > "ignoreThis.txt"                       # Create a file called "ignoreThis.txt"
    svn status                                         # Check to see if the file is ignored or not
    > ?    ./ignoreThis.txt
    > 1 unversioned file                               # ...it is NOT currently ignored
    
    svn propset svn:global-ignores "ignoreThis.txt" .
    svn status
    > 0 unversioned files                              # ...but now the file is ignored!
    
    cd subdirectory                                    # now open a subdirectory
    echo "foo" > "ignoreThis.txt"                       # create another file named "ignoreThis.txt"
    svn status
    > 0 unversioned files                              # the file is ignored here too!
    

Para usuarios de TortoiseSVN:

Todo este arreglo fue confuso para mí, porque la terminología de TortoiseSVN (como se usa en su sistema de menús del Explorador de Windows) fue inicialmente engañosa para mí: no estaba seguro de cuál es el significado de "Agregar recursivamente", "Agregar *" y "Agregar" del menú Ignorar del menú. opciones. Espero que esta publicación explique cómo la función Ignorar se vincula con la función Propiedades de SVN. Dicho esto, sugiero usar la línea de comandos para establecer archivos ignorados para que tenga una idea de cómo funciona en lugar de usar la GUI, y solo usar la GUI para manipular las propiedades después de que se sienta cómodo con la línea de comandos.

Listado de archivos que se ignoran:

El comando svn statusocultará los archivos ignorados (es decir, los archivos que coinciden con un global-ignorespatrón RGA , o coinciden con el patrón de un directorio primario inmediato svn:ignoreo con cualquier directorio ancestralsvn:global-ignores .

Use la --no-ignoreopción para ver esos archivos listados. Los archivos ignorados tienen un estado de I, luego canalizan la salida agrep mostrar solo las líneas que comienzan con "I".

El comando es:

svn status --no-ignore | grep "^I"

Por ejemplo:

svn status
> ? foo                             # An unversioned file
> M modifiedFile.txt                # A versioned file that has been modified

svn status --no-ignore
> ? foo                             # An unversioned file
> I ignoreThis.txt                  # A file matching an svn:ignore pattern
> M modifiedFile.txt                # A versioned file that has been modified

svn status --no-ignore | grep "^I"
> I ignoreThis.txt                  # A file matching an svn:ignore pattern

ta-da!

andyuk
fuente
66
Para encontrar archivos ignorados: svn status -u -v --no-ignore | grep "^ I" | awk "{print \ $ 2}"
Christian Madsen
3
si desea ignorar el archivo ./FolderA/FolderB/FileToIgnore, hágalo desde su. carpeta: svn propset svn: ignore "FileToIgnore" FolderA / FolderB /
jnj
8
si está haciendo ssh'ing svn propedit svn:ignore .y no hay un editor de texto configurado, recibirá un mensaje de error que dice svn: E205007: Ninguna de las variables de entorno SVN_EDITOR, VISUAL o EDITOR están configuradas, y no se configuró la opción de configuración de tiempo de ejecución 'editor-cmd' encontrado en lugar de abrir un editor. Tan solo especifique --editor-cmd nano como estesvn propedit svn:ignore . --editor-cmd nano
Jonathan Morales Vélez
12
También puede ignorar archivos con un nombre de archivo específico en todas las subcarpetas utilizando el argumento "--recursivo". es decir, svn propset svn: ignore "* .jpg". --recursivo
Templario
2
Una alternativa más simple a awk es grep:svn status | grep '^?'
Johnride
91

Use el siguiente comando para crear una lista que no esté bajo los archivos de control de versiones.

svn status | grep "^\?" | awk "{print \$2}" > ignoring.txt

Luego edite el archivo para dejar solo los archivos que realmente desea ignorar . Luego use este para ignorar los archivos listados en el archivo:

svn propset svn:ignore -F ignoring.txt .

Tenga en cuenta el punto al final de la línea. Le dice a SVN que la propiedad se está configurando en el directorio actual.

Eliminar el archivo:

rm ignoring.txt

Finalmente cometer

svn ci --message "ignoring some files"

Luego puede verificar qué archivos se ignoran a través de:

svn proplist -v
ulitosCoder
fuente
2
Agradable. Una mejora menor es svn status | awk "/^?/ {print \$2}" > ignoring.txt.
Dirk Eddelbuettel
44
¿Por qué borrar el archivo? manténgalo en repositorio si necesita volver a crear / agregar / eliminar
tgkprog
Tenga en cuenta que esta solución no ignorará los archivos en subdirectorios (incluso si aparecen en ignorando.txt).
shaneb
¿Eso mantendría los ignorantes existentes? Si no, ¿cómo hacerlo en un comando (es decir, --no ignora y mantiene también las líneas precedidas por I)?
a1an
Esto sobrescribiría sus ignoraciones actuales, intente: svn pg svn:ignore . >> ignore.txtdespués del primer comando para agregar las ignoraciones actuales al archivo.
ulitosCoder
55

.gitignore como enfoque

Puede ignorar un archivo o directorio como .gitignore. Simplemente cree un archivo de texto de la lista de directorios / archivos que desea ignorar y ejecute el siguiente código:

svn propset svn:ignore -F ignorelist.txt .

O si no desea utilizar un archivo de texto, puede hacerlo así:

svn propset svn:ignore "first
 second
 third" .

Fuente: Blog de Karsten - Establecer svn: ignorar para múltiples archivos desde la línea de comandos

Adrián Enríquez
fuente
1
Tenga en cuenta que si luego modifica su archivo de ignorar, debe volver a ejecutar el svn:ignorecomando (consulte stackoverflow.com/a/58380306/189518 )
Sensei James el
50

Si está utilizando TortoiseSVN , haga clic derecho en un archivo y luego seleccione TortoiseSVN / Agregar para ignorar la lista . Esto agregará el archivo / comodín a la svn:ignorepropiedad.

svn:ignorese verificará cuando esté ingresando archivos y se ignorarán los archivos coincidentes. Tengo la siguiente lista de ignorados para un proyecto de Visual Studio .NET:

bin obj
*.exe
*.dll
_ReSharper
*.pdb
*.suo

Puede encontrar esta lista en el menú contextual en TortoiseSVN / Properties .

artur02
fuente
27

Como nadie parece haberlo mencionado ...

svn propedit svn:ignore .

Luego edite el contenido del archivo para especificar los patrones a ignorar, salga del editor y ya está.

Yorick
fuente
3
Esta respuesta fue útil. En mi caso, necesitaba cambiar "." al subdirectorio del archivo que quería ignorar y solo especifique el patrón del archivo. Además, la primera vez, necesitaba ejecutar esto (estoy en Mac): export SVN_EDITOR = "nano"
Elijah Lofgren
22

Encontré el artículo .svnignore Ejemplo para Java .

Ejemplo: .svnignore para Ruby on Rails,

/log

/public/*.JPEG
/public/*.jpeg
/public/*.png
/public/*.gif

*.*~

Y después de eso:

svn propset svn:ignore -F .svnignore .

Ejemplos para .gitignore. Puede usar para su .svnignore

https://github.com/github/gitignore

d.danailov
fuente
1
hice lo que dijiste ... pero cuando ejecuto el estado svn. todavía muestra los archivos ignorados con "?"
Harshit Gupta
Nunca verifiqué con el estado de svn, pero con svn add * y después de que svn commit, ignorar los archivos no se confirma.
d.danailov
si un archivo "a.txt" ya está en el control de versiones, entonces el comando ignorar se realiza como "svn propset svn: ignore -F .svnignore a.txt"? es correcto ?
errakeshpd
Si agrega "a.txt" en su archivo .svnignore, no estoy seguro, pero el comando debería estar correctamente.
d.danailov
10

Cuando use propedit, asegúrese de no tener espacios finales, ya que eso hará que el archivo se excluya de la lista de ignorados.

Estos se insertan automáticamente si ha utilizado tab-autocomplete en linux para crear el archivo para comenzar:

svn propset svn:ignore 'file1
file2' .
Kenneth
fuente
66
Esto solo funciona para algunos shells, como bash. Tenga en cuenta que volver a emitir el comando propset sobrescribe el conjunto de patrones anterior.
JA Faucett
¿Entonces file1 y file2 tienen que estar en líneas separadas?
IgorGanapolsky
8

Otra solución es:

svn st | awk '/^?/{print $2}' > svnignore.txt && svn propget svn:ignore >> svnignore.txt && svn propset svn:ignore -F svnignore.txt . && rm svnignore.txt

o línea por línea

svn st | awk '/^?/{print $2}' > svnignore.txt 
svn propget svn:ignore >> svnignore.txt 
svn propset svn:ignore -F svnignore.txt . 
rm svnignore.txt

Que hace:

  1. Obtiene los archivos de estado del svn
  2. Guarda todos los archivos con ?al archivo "svnignore.txt"
  3. Obtiene los archivos ya ignorados y los agrega al archivo "svnignore.txt"
  4. Le dice al svn que ignore los archivos en "svnignore.txt"
  5. Elimina el archivo
bkbilly
fuente
8

Además, si usa Tortoise SVN, puede hacer esto:

  1. En el menú contextual seleccione "TortoiseSVN", luego "Propiedades"
  2. En la ventana aparecida, haga clic en "Nuevo", luego "Avanzado"
  3. En la ventana que aparece frente a "Nombre de la propiedad", seleccione o escriba "svn: ignore", opuesto al "Valor de la propiedad", escriba el nombre del archivo deseado o el nombre de la carpeta o la máscara del archivo (en mi caso era "* / target"), haga clic en "Aplicar propiedad recursivamente "
  4. Okay. Okay.
  5. Cometer
msangel
fuente
6
  1. cd ~ / .subversion
  2. configuración abierta
  3. encuentra la línea como 'global-ignores'
  4. establezca ignorar el tipo de archivo de esta manera: global-ignores = * .o * .lo * .la * .al .libs * .so .so . [0-9] * .pyc * .pyo 88 * .rej ~ # #. # *. *. swp .DS_Store salida node_modules
范 陆 离
fuente
Gracias, su respuesta es la única que menciona el configarchivo.
Henrique de Sousa
Esta respuesta también lo menciona en @HenriquedeSousa stackoverflow.com/a/86052/7724 y también explica que es una forma local solo para clientes de ignorar archivos.
bzlm
5

Una versión más legible de la respuesta de bkbilly:

svn st | awk '/^?/{print $2}' > svnignore.txt
svn propget svn:ignore >> svnignore.txt
svn propset svn:ignore -F svnignore.txt .
rm svnignore.txt

Que hace:

  1. Obtiene los archivos de estado del svn
  2. Guarda todos los archivos con ?al archivo "svnignore.txt"
  3. Obtiene los archivos ya ignorados y los agrega al archivo "svnignore.txt"
  4. Le dice al svn que ignore los archivos en "svnignore.txt"
  5. Elimina el archivo
LivingDust
fuente
Me gusta la respuesta de bkbilly, pero esta versión rompe cada línea para hacerla más legible y elimina el && que en mis pruebas no hizo nada, ya que la primera línea siempre crea el archivo temporal, y este mismo archivo temporal siempre entra en la lista de ignorados.
LivingDust
Una propuesta de edición sería más apropiada en este caso. Agradezco el esfuerzo!
Jim
Todavía no tenía suficiente reputación para sugerir una edición. pero no quiero arruinar un buen protocolo. ¿Existe un archivo README simple sobre pautas sobre cuándo es mejor sugerir y editar en lugar de publicar una nueva respuesta, etc.?
LivingDust
1
Si su respuesta es exactamente la misma que la publicada hace un año y medio, es bastante sencillo. Incluso copió la explicación " Qué hace ".
Jim
3

También puede establecer un patrón de ignorar global en el archivo de configuración de SVN.

petr k.
fuente
1
¿Se puede establecer un patrón de ignorar para un repositorio específico?
David Doria
3

svn status le dirá qué archivos no están en SVN, así como qué ha cambiado.

Mire las propiedades SVN para la propiedad ignorar.

Para todas las cosas SVN, se requiere la lectura del Libro Rojo .

DGM
fuente
2

Use el comando svn status en su copia de trabajo para mostrar el estado de los archivos, los archivos que aún no están bajo control de versiones (y no ignorados) tendrán un signo de interrogación al lado.

En cuanto a ignorar archivos, necesita editar la propiedad svn: ignore, lea el capítulo Ignorar elementos no versionados en el svnbook en http://svnbook.red-bean.com/en/1.5/svn.advanced.props.special.ignore. html . El libro también describe más sobre el uso del estado svn.

Andreas Holstenson
fuente
2

SVN ignore es fácil de administrar en TortoiseSVN. Abra TortoiseSVN y haga clic derecho en el menú de archivo, luego seleccione Agregar para ignorar la lista.

Esto agregará los archivos en la svn:ignorepropiedad. Cuando revisamos los archivos, los archivos que coinciden consvn:ignore eso se ignorarán y no se confirmarán.

En el proyecto de Visual Studio hemos agregado los siguientes archivos para ignorar:

bin obj
*.exe
*.dll
*.pdb
*.suo

Estamos administrando el código fuente en SVN de Comparetrap usando este método con éxito

Flojo
fuente
2

Lo que funcionó para mí:

¿Cómo ignoro los archivos en Subversion?
1.En el Explorador de archivos, haga clic derecho en el nombre de la carpeta del proyecto SVN
2.Haga clic en "SVN Commit ..."
3.Aparecerá una ventana "commit"
4.Haga clic derecho en la carpeta / archivo que desea ignorar
5.Haga clic en Agregar para ignorar la lista
6.Seleccione la carpeta / archivo
7.Commitir el "cambio de propiedad" a SVN

Además, ¿cómo encuentro archivos que no están bajo control de versiones?
Después del paso 3 anterior, haga clic en "Mostrar archivos no versionados"

jumping_monkey
fuente
0
  1. abrir utiliza el producto JetBrains (es decir, Pycharm)
  2. luego haga clic en el botón 'confirmar' en la barra de herramientas superior o use el atajo 'ctrl + k' screenshot_toolbar
  3. en la interfaz de confirmación, mueva sus archivos no deseados a otra lista de cambios de la siguiente manera. screenshot_commit_change
  4. la próxima vez solo puede confirmar la lista de cambios predeterminada.
G. Googol
fuente