2011-04-06 19 views
22

Alguien en nuestro equipo ha cometido accidentalmente archivos que contienen una contraseña para nuestro repositorio. La contraseña no puede ser cambiada fácilmente.Borrar todos los rastros de un commit de SVN

¿Hay alguna manera, con permisos de administrador completo, de eliminar todos los rastros de esta confirmación? No estoy hablando de una reversión o eliminación, que obviamente mantendría la contraseña en el historial del archivo.

Respuesta

27

Sí, pero no es para los débiles de corazón. Debe usar svnadmin dump y svnadmin load para recrear su repositorio.

Si elige hacer esto, el primer paso es evitar que sus usuarios cometan, y hacer una copia de seguridad de su repositorio. También recomiendo ver los pasos en una copia de su repositorio; puede usar rsync para copiar todo el directorio del repositorio en un directorio temporal y trabajar desde allí.

Para estas instrucciones, voy a crear un nuevo repositorio en un directorio temporal:

tmp, 502> svnadmin create example.repo 
tmp, 503> svn co file://`pwd`/example.repo example 
Checked out revision 0. 

he creado un archivo que contenía cuatro revisiones, la tercera de las cuales es necesario tachar:

example, 536> svn log test.txt 
------------------------------------------------------------------------ 
r4 | kgregory | 2011-04-06 08:46:59 -0400 (Wed, 06 Apr 2011) | 1 line 

post-bad commit 
------------------------------------------------------------------------ 
r3 | kgregory | 2011-04-06 08:46:42 -0400 (Wed, 06 Apr 2011) | 1 line 

bad revision 
------------------------------------------------------------------------ 
r2 | kgregory | 2011-04-06 08:46:28 -0400 (Wed, 06 Apr 2011) | 1 line 

good revision 
------------------------------------------------------------------------ 
r1 | kgregory | 2011-04-06 08:46:02 -0400 (Wed, 06 Apr 2011) | 1 line 

initial revision 
------------------------------------------------------------------------ 

Por lo tanto, tenemos que volcar las revisiones tanto antes como después de la incorrecta, utilizando el indicador -r para especificar los rangos de revisión. El indicador --incremental en el segundo volcado es importante, ya que le indicará al comando de carga que no cree un nuevo archivo.

Tenga en cuenta que estoy ejecutando estos comandos desde el mismo directorio que contiene el repositorio.

svnadmin dump -r 1:2 example.repo/ > pred.svndump 
* Dumped revision 1. 
* Dumped revision 2. 
tmp, 552> svnadmin dump -r 4:4 --incremental example.repo/ > succ.svndump 
* Dumped revision 4. 

Ahora mueve el repositorio original, fuera del camino, y crear un repositorio vacío con el mismo nombre:

tmp, 540> mv example.repo example.repo.bak 
tmp, 541> svnadmin create example.repo 

e importar el contenido de los archivos de volcado.

tmp, 569> svnadmin --quiet load example.repo < pred.svndump 
tmp, 570> svnadmin --quiet --ignore-uuid load example.repo < succ.svndump 

Ahora decirle a todos para borrar sus directorios de trabajo y echa un vistazo fresco.Y hay que ver el siguiente registro:

example, 574> svn log test.txt 
------------------------------------------------------------------------ 
r3 | kgregory | 2011-04-06 08:46:59 -0400 (Wed, 06 Apr 2011) | 1 line 

post-bad commit 
------------------------------------------------------------------------ 
r2 | kgregory | 2011-04-06 08:46:28 -0400 (Wed, 06 Apr 2011) | 1 line 

good revision 
------------------------------------------------------------------------ 
r1 | kgregory | 2011-04-06 08:46:02 -0400 (Wed, 06 Apr 2011) | 1 line 

initial revision 
------------------------------------------------------------------------ 

Hay una enorme advertencia: este proceso supone que no ha habido ningún commit en el archivo desde la entrega mala (es decir, el sucesor de volcado sólo contiene cambios a otros archivos).

Si ese no es el caso, aún puede eliminar la revisión, pero es mucho más trabajo. Debe crear un nuevo check-in, que contenga una copia limpia del archivo junto con cualquier otro archivo que se haya cambiado con él mientras esté en mal estado. A continuación, cree varios archivos dump, sin incluir las revisiones que contengan el archivo incorrecto.

Finalmente: recomiendo encarecidamente varias carreras en seco. Como se puede ver en los números de historia en mis ejemplos, me equivoqué un par de veces. Como dije al principio, es fácil copiar un repositorio de Subversion en un directorio temporal. Y cuando lo haces, puedes seguir intentándolo hasta que lo hagas bien, luego simplemente copia el repositorio fijo en su lugar.

+2

Gracias por su respuesta detallada. Sabiendo esto, decidimos que era más simple cambiar la contraseña en lugar de seguir los pasos que describió. – MasterScrat

6

ver la respuesta en el FAQ

Hay casos especiales en los que es posible que desee para destruir toda evidencia de un archivo o cometer. (Tal vez alguien accidentalmente haya confiado un documento confidencial.) Esto no es tan fácil, porque Subversion está diseñada deliberadamente para nunca perder información. Las revisiones son árboles inmutables que se construyen unos sobre otros. Eliminar una revisión de la historia provocaría un efecto dominó, creando caos en todas las revisiones posteriores y posiblemente invalidando todas las copias de trabajo.

El proyecto tiene planes, sin embargo, de implementar algún día un comando svnadmin obliterate que logre la tarea de eliminar información permanentemente. (Consulte el problema 516.)

Mientras tanto, su único recurso es svnadmin volcar su depósito, luego canalizar el archivo de volcado a través de svndumpfilter (excluyendo el mal camino) en un comando de carga svnadmin. Vea el capítulo 5 del libro de Subversion para más detalles sobre esto.

+0

Tenga en cuenta que 'svndumpfilter' sólo sabe cómo incluir o excluir caminos. A menos que tenga cuidado, el archivo puede desaparecer por completo. – kdgregory

Cuestiones relacionadas