SVN: ignora algunos directorios de forma recursiva

106

No quiero ningún directorio con nombre buildodist que entre en mi SVN sin importar qué tan profundo esté en el árbol.

es posible? En git acabo de poner

build
dist

en mi .gitignoreen la raíz y recursivamente ignora. ¿Cómo hago esto con svn? Por favor, no me digas que haga un propset en cada directorio principal ...

Paul Tarjan
fuente
Consulte esta respuesta para obtener una solución nativa si está utilizando Subversion 1.8.
Frank Kusters

Respuestas:

57

A partir de la subversión 1.8, ahora existe la svn:global-ignorespropiedad que funciona como svn:ignorepero de forma recursiva (así que configure esto en su directorio de nivel superior)

gemelo
fuente
3
Estoy un poco confundido: hay global-ignoresen el ~/.subversion/configarchivo, pero también la propiedad heredable svn:global-ignores establecida en un directorio en un repositorio de SVN, así como svn:ignore, ¿puede proporcionar un resumen de estas diferentes opciones y cómo se comparan? ¿Cómo --recursiveles afecta también la bandera?
Dai
2
Hice mi propia investigación y publiqué mis hallazgos en esta respuesta de control de calidad: stackoverflow.com/a/86052/159145
Dai
[Lo intenté pero fallé, la objcarpeta todavía apareció] ( stackoverflow.com/questions/50960188/… ), ¿pueden ayudarme a echarle un vistazo?
Lucas
¿Puedo decir "build / *" ir ignorando todo lo que se encuentra debajo de build dentro de cada carpeta de build?
Johannes Schaub - litb
45

svn propsettoma --recursivecomo opción, por lo que puede hacer esto, con dos inconvenientes:

  1. tienes que revisar todo el repositorio (o al menos todos los directorios que contiene), y
  2. debe recordar establecer la svn:ignorepropiedad cada vez que agrega un nuevo directorio
Michael Hackner
fuente
42

No es posible hacer esto. Solo hay dos mecanismos de ignorar en Subversion, svn:ignore(que no es recursivo) y global-ignores(que no es específico de un repositorio).

Kevin Reid
fuente
7
svn propset --recursive svn: ignora svn_ignore_rules. donde svn_ignore_rules es un archivo que contiene las reglas de ignorar - una por línea
georg
3
'svn propset --recursive svn: ignore --file svn_ignore_rules.' para mí con svn-1.7.6, de lo contrario, está ignorando de forma recursiva los archivos llamados 'svn_ignore_rules' [editar: según 'wytten' en un comentario a continuación]
elbeardmorez
9
A los comentaristas: Como dijo el autor de la pregunta, "Por favor, no me digan que haga un conjunto de accesorios en cada directorio principal ...".
Kevin Reid
5
Ahora es posible en Subversion 1.8
Squirrel
17

Esto funciona para mi:

 svn propset --recursive svn:ignore *.zip <dir_tree_with_no_zips>
Stewart
fuente
2
Gracias por esto, funciona muy bien ... Por cierto, la única forma que encontré para ignorar tanto * .txt como * .pdf fue poner esos patrones en un archivo y luego usar la opción 'svn propset --file'
wytten
13

agregue a su archivo ~ / .subversion / config o / etc / subversion / config:

[miscellany]
global-ignores = build dist
jspcal
fuente
Prefiero hacerlo por repositorio si puedo
Paul Tarjan
1
hmm no estoy seguro de si hay una manera fácil de hacerlo por repositorio, un gancho de confirmación previa podría rechazar ciertos patrones, pero no es una solución completa. svn: ignorar en cada directorio padre funciona, pero no de forma recursiva. puede intercambiar su archivo de configuración con un script cuando trabaja en diferentes repositorios, pero ese es un paso adicional.
jspcal
1
¿Qué significa build dist ?
IgorGanapolsky
9

Es posible ignorar los directorios build y dist eliminando los directorios del control de versiones. El truco consiste en usar la opción --keep-local para dejar el directorio en la copia de trabajo. Por ejemplo:

svn rm dist --keep-local
svn ci -m'removed build directory from version control'

Subversion ya no rastreará el directorio, pero seguirá estando allí en su copia de trabajo para contener la salida del compilador, etc.

salud, Joe

jsharit
fuente
7

Por ejemplo, la estructura de carpetas:

Project/
Project/dist/

cd Project
svn propset svn:ignore '*' dist/
svn ci -m "content of dist ignored"

Es bueno hacer una eliminación svn del contenido dist antes del comando ignore, por lo que para las ramas dist estará vacío.

Funcionó para mí, probado hoy. Aquí está la página que lo explica un poco.

mariano
fuente
6

Para ignorar todos esos archivos en todos los repositorios, puede agregar un global-ignoresa su archivo de configuración por usuario.

En sistemas similares a Unix, esta área aparece como un directorio llamado .subversion en el directorio de inicio del usuario. En los sistemas Win32, Subversion crea una carpeta llamada Subversion, generalmente dentro del área de Datos de la aplicación del directorio del perfil del usuario.

Ver opciones de configuración

Desafortunadamente, no hay una opción por repositorio para hacer esto. Básicamente es por usuario o por directorio, por lo que el múltiplo svn:ignoreses probablemente el camino a seguir, por molesto que pueda ser.

Blair Conrad
fuente
1
Prefiero hacerlo por repositorio si puedo
Paul Tarjan
Entonces no tienes suerte. Como dice @Kevin Reid, tienes por directorio o por usuario.
Blair Conrad
6

Primero debe moverse a la carpeta superior de su copia de trabajo y crear un archivo allí (digamos .svnignore) donde debe colocar todos los patrones que desea que se ignoren, por ejemplo (para un proyecto de Android):

bin
gen
proguard
.classpath
.project
local.properties
Thumbs.db
*.apk
*.ap_
*.class
*.dex

Luego ejecuta el siguiente comando (recuerde que debe estar en la carpeta superior de su copia de trabajo):

svn propset svn:ignore -R -F .svnignore .

Esto solo funcionará para carpetas y archivos que aún no están bajo el control de versiones. Si desea que una carpeta (o archivo) que se está versionando comience a ser ignorada también, elimínela del control de versiones ejecutando el comando:

svn rm --keep-local <path>

Obtuve todo esto de este gran artículo que lo explica todo: http://superchlorine.com/2013/08/getting-svn-to-ignore-files-and-directories/

Luccas Correa
fuente
Esto fue de gran ayuda. Esta es la mejor manera que he encontrado para obtener un comportamiento de ignorar similar a git en svn. Muchas gracias.
Jonathan Wilson
6

En la subversión 1.8, es posible establecer omisiones globales para el repositorio actual.

svn propset svn:global-ignores build .
svn propset svn:global-ignores dist .

También puede crear una carpeta llamada .svnignore y escribir condiciones.

build
dist

recuerde una condición por línea, configurar build / * o dist / debug es en vano. Luego haz el comando:

svn propset svn:global-ignores -F .svnignore .
John Zhu
fuente
¡funciona perfectamente! simplemente ejecute el primer comando en el repositorio recién verificado.
gaurav
3

Cree un archivo y agregue sus ignorados en él

ingore-list:

file1 
directory1
file2
etc...

luego aplica el siguiente comando

for n in directory; do svn propset svn:ignore -F ignore-list $n; done

directorio es el nombre de su directorio, puede subcategorizar también directorio / subdirectorio. O use * para anotar el directorio actual en el que se encuentra.

Esto es asumiendo que está usando bash como su shell

jncc99
fuente
¿Qué es el $ n aquí?
IgorGanapolsky
1
@igor Ganapolsky: $ n es la variable del bucle for. Se establecerá como el índice de la secuencia en la que está ingresando; en este caso, el directorio especificado por "directorio" en el ejemplo anterior.
jncc99
3
svn propset --recursive svn:ignore svn_ignore_rules .

donde svn_ignore_rules es un archivo que contiene las reglas de ignorar, una por línea

Por supuesto, debe volver a ejecutarlo cada vez que agrega un nuevo directorio a su repositorio.

svn_ignore_rules también se puede considerar que está registrado en el repositorio, para ser reutilizado por otros usuarios que tengan acceso de escritura al repositorio

georg
fuente
2
cd parent_dir # el directorio que contiene la carpeta que se ignorará de forma recursiva
svn propedit svn: ignorar. # abrirá svn-prop.tmp
alistar carpeta (s)
^ X
Y
commit -m 'ignorar direcoty dirigido'
Moin Haidar
fuente
me ayudó, tuve un problema con la configuración del patrón de la carpeta, SVN estaba cumpliendo esa carpeta que no estaba en el repositorio set EDITOR=notepad, svn propedit svn:ignore .funcionó bien ...
Betlista
1

Dado que parece que no hay solución para este problema probablemente común, me gustaría compartir nuestra solución. Como los demás ya dejaron en claro, puede usar la svn:ignorepropiedad, esto se aplica a un solo directorio (y, por lo tanto, no a los nuevos), o usa la global-ignoresque se aplica a un solo usuario (pero no pertenece al repositorio).

Para hacer la vida un poco más fácil, creé un archivo reg llamado Settings.Svn.regy lo agregué a la raíz del repositorio. Ahora todo el mundo puede hacer doble clic en este archivo de registro una vez y habrá terminado la configuración.

REGEDIT4

[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\miscellany]
"global-ignores"="obj *.suo *.bak *.pdb *.user *.Cache*"

Realmente agradecería una solución dentro del repositorio SVN, así que si alguien lo sabe, ¿le importaría compartirla?

martinstoeckli
fuente
0

Una forma sería agregar algún tipo de verificación al gancho previo o posterior a la confirmación, pero es una nota directa si no es propietario del servidor de repositorio.

8DH
fuente