2009-09-17 15 views
42

Suponga que tiene un directorio bajo el control de la subversión, que contiene algunos archivos y subdirectorios de toneladas, al igual que:SVN: ¿Puede eliminar directorios de un proceso de pago local solamente (no desde el repositorio)?

file1.txt 
file2.txt 
file3.txt 
dir1/ 
dir2/ 
dir3/ 
dir4/ 
: 
dirXX/ 

Ahora necesita los archivos y algunos de los directorios, pero no todos ellos. Esto se puede hacer con SVN. Acaba de hacer el pago y envío no recursivo:

svn checkout -N <URL> 

Este obtiene sólo el primer directorio y los archivos dentro. No hay subdirectorios incluidos. Incluso si entra en el directorio de pago y ejecuta un "svn up", solo actualizará los archivos prestados anteriormente, no agregará los directorios. Ahora puede agregar selectivamente los directorios que necesita al actualizarlos explícitamente. P.ej. si necesita directorio2 y sólo dir4, se puede entrar en el directorio de la caja y ejecutar

svn up dir2 
svn up dir4 

Si ejecuta un genérico "svn up" en el futuro, un viaje de solo actualizar los archivos y los dos directorios, no lo hará agregue cualquiera de los otros directorios.

Ahora el problema: ¿y si decido en algún momento posterior que ya no necesito el directorio2? ¿Como me deshago de esto? Parece que no hay forma de hacerlo, aparte de eliminar todo el proceso de pago y comenzar de cero.

Cuando simplemente borra el dir2, el próximo "svn up" lo traerá de regreso, ya que "svn status" por supuesto lo muestra como ausente ahora ("!" Delante de su nombre). Ejecutar un "svn remove" lo eliminará, por supuesto, pero en la siguiente confirmación también lo eliminará del repositorio, lo que no debe suceder.

Incluso el nuevo directorio escasa ("la caja poco profunda") característica de la SVN 1.5 es de ninguna utilidad aquí:

subversión de 1,5 implementación de cajas de poca profundidad es bueno, pero no lo hace ayuda de un par de comportamientos interesantes . En primer lugar, no puede des-telescopiar un elemento de copia de trabajo. Ejecutando svn update --set-depth vacío en una copia de trabajo de profundidad infinita no tendrá el efecto de descartar todo excepto el más alto directorio-simplemente se producirá un error de salida.
- http://svnbook.red-bean.com/en/1.5/svn.advanced.sparsedirs.html

¿Es esta completa imposible con SVN? ¿Alguien alguna vez se le ocurrió un trabajo inteligente para eso?

Simplemente creando el directorio de finalización (sin SVN) y luego verificando los subdirectorios individuales del repositorio directamente como subdirectorios de este directorio funcionarán para los directorios: ahora cada directorio es propio, se puede actualizar y una vez ya no es necesario, simplemente puede eliminarlo. Sin embargo, ¿cómo obtengo los archivos (por ejemplo, archivo1.txt)? SVN no permite consultar los archivos individuales, solo puede verificar directorios completos.

+0

Creo que esta es la misma pregunta que estos dos: http://stackoverflow.com/questions/ 862950/subversion-prevention-local-modifications-to-one-file-from-being-committed, http: // stackoverflow.com/questions/635446/svn-is-there-a-way-to-mark-a-file-as-do-not-commit –

+0

@ire_and_curses: Primero, ¿por qué no escribes esto como respuesta? Segundo: estas dos preguntas tratan de evitar que algo se comprometa. Esto no tiene nada que ver con mi problema en absoluto. Incluso si hago svn delete en el directorio y evito que esto se confirme, el directorio no desaparecerá. ¿Has leído mi pregunta o solo el titular? – Mecki

+0

@Mecki: Leí tu pregunta, aunque admito que tienes prisa. Creí * que estabas preguntando cómo eliminar un directorio controlado por versión en la copia local sin afectar la versión del repositorio, y sin recuperar el directorio en la próxima actualización. Aunque no lo he probado, parece que hacer que todo lo demás sea miembro de una lista de cambios hará exactamente eso. No escribí esto como una respuesta porque ya existe en las otras dos preguntas (que pensé que eran las mismas). Si tuviera razón, me gustaría obtener un representante para el trabajo de otra persona. Lo siento si esto no te sirve. –

Respuesta

50

Odio que responda a mis propias preguntas ... me hace sentir tan tonto. Y odio que sea aún más el que proporciona la mejor respuesta, pero desafortunadamente, esta es la única respuesta real:

Lo que trato de hacer no se puede hacer con Subversion 1.4 o Subversion 1.5; Período.
No existe una solución alternativa, así es como es.

Sin embargo, se puede hacer con Subversion 1.6.

diferencia de SVN 1.5, SVN 1.6 puede reducir la profundidad en un directorio

svn up --set-depth exclude dir2 

es la solución. Establece la profundidad de dir2 en cero e inmediatamente se desvanecerá de la salida y ninguna actualización lo recuperará, a menos que establezca explícitamente la profundidad de este directorio en un valor (o simplemente realice una actualización sin la opción de profundidad, ya que no dar ninguna profundidad siempre significa infinito, a menos que use no recursivo, lo que significa "archivos").

CONSEJO:
En realidad SVN 1.6 realmente no puede reducir la profundidad de la misma manera que puede aumentarla. Puede aumentarlo de cualquier nivel a cualquier nivel superior. Solo puede reducirlo a "excluir" (el nivel más bajo de todos). Si desea reducir de "infinito" (más alto) a "archivos" (en algún lugar en el medio), primero debe reducirlo a "excluir" (haciendo que el directorio desaparezca) y luego aumentarlo de nuevo a "archivos". Esto es un truco, pero funciona muy bien.

+1

+1 pero es "subversión 1.6". No hay tal cosa como "subversión 6". –

+4

Lo siento, he estado trabajando con Java durante mucho tiempo, supongo -> Java 2 es Java 1.2, Java 5 es en realidad Java 1.5 y así sucesivamente ;-) – Mecki

+1

+1 directorios múltiples pueden ser excluidos dando valores separados por espacio Ejemplo: svn up --set-depth exclude dir1 dir2 dir3 – Ritesh

1

Puede probar este trick que implica un repositorio local y svn: declaraciones externas.

No lo he probado, sin embargo.

+0

¡Esto suena bastante interesante! Primera respuesta y ya una muy buena (upvote). No estoy seguro si esta es la mejor solución y si esto realmente resolverá mi problema, pero debería probar esta solución. Si esto funciona y nadie tiene nada más fácil de ofrecer, aceptaré esta respuesta. Incluso si no resuelve mi problema, podría resolver algunos otros problemas de SVN (por lo que este conocimiento es útil en cualquier caso) – Mecki

+0

Lo siento, esto realmente no puede resolver mi problema. Puedo hacer un repositorio local y simplemente vincular en algunos de los subdirectorios, por lo que solo aparecen ... y probablemente pueda desvincularlos (eliminando la declaración externa) y se irán ... pero no tengo forma de obtener el archivos fileX.txt en el directorio principal, ya que no puede vincular en archivos únicos, solo directorios y vínculos en este directorio enlaces en los archivos y todos los subdirectorios de la misma :( – Mecki

9

Actualización: Estoy ejecutando SVN 1.6.11 y pude des-telescopiar usando svn up --set-depth empty dir en lugar de tener que exclude el directorio.

1

Con svn 1.6, --set-depth es la respuesta.

con SVN < 1.6, puede obtener obtenciones parciales al abusar de svn switch: Crear un directorio vacío en algún lugar de su repositorio, y switch los subdirectorios que no es necesario en este momento para señalar que, en lugar de su URL "real".

36

Para cualquier persona que viene a través de esta tarde, y utiliza TortoiseSVN , aquí es cómo hacer lo mismo ...

  1. Haga clic derecho en la carpeta que ya no desea desprotegido (esta es la carpeta que desea excluir)
  2. En el menú contextual, seleccione "TortoiseSVN> Actualizar a la revisión ..."
  3. En la ventana que aparece, establezca el cuadro desplegable "actualización de profundidad" a "Excluir "
  4. Haga clic en "Aceptar". SVN eliminará automáticamente ese directorio de tu disco ahora.

(Nota: Esto se hizo con TortoiseSVN 1.7.5, y puede variar para otras versiones.)

+1

+1 Esto fue útil para mí – aolszowka

+2

Este es un salvavidas. Gracias. – Emanuel

+0

Gott bendiga esta opción #SSD –

Cuestiones relacionadas