2008-10-15 13 views
34

No estoy muy seguro de cómo sucedió esto, pero de alguna manera una jerarquía de directorios completamente vacío ha terminado en mi repositorio:¿Quitar el directorio vacío de CVS?

com/ 
com/companyname/ 
com/companyname/blah/ 
com/sun/ 
com/sun/java/ 
com/sun/java/jax_rpc_ri/ 

Creo que lo que ocurrió fue que estos directorios tenían archivos en ellos, pero luego un desarrollador se dio cuenta de que no debería haberlos registrado, ya que estos son subproductos del proceso de compilación, por lo que eliminó los archivos, pero de alguna manera los directorios vacíos se dejan en el repositorio como reliquias antiguas.

¿Cómo puedo eliminar esto de CVS? Los únicos resultados que parece que puedo encontrar en google dicen que no debería haber una necesidad de eliminar directorios vacíos ya que CVS no los mantendrá en primer lugar, y que las opciones -P (ciruela) a cvs update deberían eliminarse. desde el directorio de trabajo, que es de cero ayuda si realmente tiene directorios vacíos en su repositorio.

Un cvs remove y cvs commit no parece hacerse cargo de esta situación:

$ cvs remove -Rf com 
cvs remove: Removing com 
cvs remove: Removing com/companyname 
cvs remove: Removing com/companyname/blah 
cvs remove: Removing com/sun 
cvs remove: Removing com/sun/java 
cvs remove: Removing com/sun/java/jax_rpc_ri 
$ cvs commit com 
cvs commit: Examining com 
cvs commit: Examining com/companyname 
cvs commit: Examining com/companyname/blah 
cvs commit: Examining com/sun 
cvs commit: Examining com/sun/java 
cvs commit: Examining com/sun/java/jax_rpc_ri 
$ ls -l com 
total 24 
drwxrwxr-x 2 matt matt 4096 Oct 15 14:38 CVS 
drwxrwxr-x 9 matt matt 4096 Oct 15 14:38 companyname 
drwxrwxr-x 4 matt matt 4096 Oct 15 14:38 sun 

Todavía está allí!

¿SVN también tiene este extraño comportamiento?

Respuesta

36

AFAIK el protocolo CVS no permite eliminar directorios. Debe ir a la consola del servidor y eliminarlos del repositorio físico real.


http://www.network-theory.co.uk/docs/cvsmanual/Removingdirectories.html

no quita el directorio en sí mismo; no hay forma de hacerlo.

+4

¡Advertencia! Es necesario ir al repositorio real, físico, porque una vez que CVS pierde un directorio, nunca puede recuperarlo nuevamente. CVS almacena los archivos que se han borrado en carpetas especiales llamadas 'Attic'. Si borra el 'Ático', esos archivos se pierden para siempre. –

+1

Siempre piénselo dos veces antes de hacer algo como esto, pero no veo ningún problema: 'ssh cvsserver:/cvsroot 'tar cvf com.tar com''; 'scp cvsserver: /cvsroot/com.tar .'; 'cvs add com.tar'; 'cvs ci com.tar'; 'cvs rm -f com.tar'; 'ssh cvsserver:/cvsroot 'rm -rf com.tar com'' – minopret

20

La comprobación y actualización de CVS siempre echa un vistazo a los directorios vacíos; así es como se construye CVS. Hacer una actualización con "-P" - "ciruela" - para eliminar los directorios vacíos:

cvs update -dP 

(Adición "-d" se actualizará nuevos directorios que han aparecido desde su última actualización, de lo contrario, CVS ignorará ellos.)

+4

Esto solo elimina los directorios vacíos de la copia de trabajo; deseo eliminarlos del repositorio. –

1

cvs tiende a trabajar en un enfoque de dos fases con respecto a los directorios por lo que hay una opción -P para muchos comandos cvs para "Podar directorios vacíos".

Cuando esto ha sucedido, p. quiero renombrar un directorio que acabo de agregar, elimino el directorio, elimino la entrada para el directorio en el archivo CVS/Entries, será una línea precedida por una "D".

Trabajo hecho.

Si me he comprometido, me aseguro de que mi área de trabajo actual que contiene el/los directorio/s vacíos esté registrada/listada. Luego elimino la parte del área de trabajo a la que agregué los directorios.

Por ejemplo, en

~/Sandbox/my_project/some_stuff_i_want 
~/Sandbox/my_project/empty_dir_1 
~/Sandbox/my_project/other_stuff_i_want 

que asegurarse de que todo está al día en ambos directorios que contienen las cosas que quiero seguir. A continuación, elimino mi proyecto de mi caja de arena.

Entonces eliminar los directorios vacíos desde el propio repositorio.

Volviendo y revisando la misma área de trabajo, p. my_project me dará el área de trabajo sin los directorios vacíos.

O simplemente deje todo como está y use la opción -P para que CVS compruebe todo (o actualice todo), luego elimine los directorios vacíos.

HTH

aplausos,

Rob

+0

Gracias. Esto me ayudó a deshacer el daño causado por algún idjut en el trabajo. – Tanktalus

4

CVS tiene una serie de defectos de diseño, nunca es capaz de deshacerse de un directorio sin perder el histórico es uno. La dificultad para renombrar archivos y directorios sin perder el historial es otra.

Considere la posibilidad de graduarse en Subversion. cvs2svn hace un muy buen trabajo al convertir repositorios incluyendo todas las ramas y etiquetas. Los conjuntos de comandos CVS y SVN son muy similares y requieren un ajuste mínimo. (Y para evitar que se convierta en una "guerra de control de versiones") una vez que esté utilizando SVN puede pasar a cualquier número de sistemas de control de versiones más avanzados como git o SVK.

7

acaba de hacer

  1. rm -rvf/localCopy/proyecto/emptyDirectory
  2. editar/localCopy/proyecto/CVS/entradas, borrar la línea D/emptyDirectory ////, guardar el archivo
  3. rmdir -v/CVSROOT/project/emptyDirectory

para deshacerse de emptyDirectory in project. Admitir que no es legítimo interferir con los datos internos de CVS, pero parece haber funcionado (cvs versión 1.12.13).

4

Esto funcionó para mí. Básicamente Cuando lo haces

rmdir -v/CVSROOT/project/emptyDirectory # Estamos eliminando el directorio del directorio del repositorio de CVS.

Si tiene acceso de inicio de sesión de servidor unix de repositorio, puede viajar a la ruta y puede eliminar el directorio, o plantear la misma preocupación con el equipo de Unix.

1

No puede eliminar el directorio de su área de trabajo, necesita eliminarlo de ir al servidor donde se guarda el depósito real. pero puede eliminar archivos del directorio con el comando cvs remove.

Cuestiones relacionadas