subversion and svn large-files

and - Nuking enorme archivo en el repositorio svn



github vs svn difference (4)

Si puede atraparlo tan pronto como se cometa, la técnica svnadmin volcar / cargar no es demasiado dolorosa. Supongamos que alguien acaba de cometer accidentalmente gormundous-raw-image.psd en la Revisión 3849. Puede hacer esto:

svnadmin dump /var/repos -r 1:3848 > ~/repos_dump

Eso crearía un archivo de volcado que contiene todo, incluida la Revisión 3848. En ese punto, podría usar svnadmin create y svnadmin load para reconstituir el repositorio sin el compromiso ofensivo, con la salvedad de que cualquier cambio que haya realizado dentro de la estructura de directorio del repositorio- -los ganchos, los enlaces simbólicos, los cambios de permisos, los archivos de autenticación, etc.- tendrían que copiarse desde el directorio anterior. Aquí hay un ejemplo del resto de la sesión de bash que puede usar para completar la operación:

svnadmin create /var/repos-new svnadmin load /var/repos-new < ~/repos_dump cp -r /var/repos/conf /var/repos-new cp -r /var/repos/hooks /var/repos-new mv /var/repos{,-old} && mv /var/repos-new /var/repos

Estoy seguro de que esto será más doloroso cuanto más historia tenga su repositorio, pero funciona.

Como el zar de la subversión local, les explico a todos que mantengan solo el código fuente y los archivos de texto no grandes en el repositorio, no grandes archivos de datos binarios. Archivos binarios más pequeños que son parte de las pruebas, tal vez.

¡Desafortunadamente trabajo con humanos ! Es probable que alguien contraiga accidentalmente un casco binario de 800MB. Esto ralentiza las operaciones del repositorio.

La última vez que revisé, no puedes eliminar un archivo del repositorio; solo haz que no sea parte de la última revisión. El repositorio guarda el monstruo para toda la eternidad, en caso de que alguien quiera recordar el estado del repositorio para esa fecha o número de revisión.

¿Hay alguna manera de eliminar realmente ese archivo de monstruos y terminar con un repositorio de tamaño decente? He intentado el svnadmin volcar / cargar cosa pero fue un dolor.


Para eliminar permanentemente archivos monstruosos de un repositorio svn, no hay otra solución que usar svnadmin dump / load. ( SVN Book: comando de volcado )

Para evitar que se comprometan grandes archivos, se puede usar una secuencia de comandos de enlace. Podría tener, por ejemplo, un script que ejecute "precomprometer" cada vez que alguien intente comprometerse con el repositorio. La secuencia de comandos podría verificar el tamaño del archivo, o el tipo de archivo, y rechazar la confirmación si contenía un archivo o archivos que eran demasiado grandes o de tipo "prohibido".

Los usos más típicos de los scripts hook son verificar (precomprome) que un commit contenga un mensaje de registro, o (post-commit) para enviar por correo electrónico los detalles del commit o para actualizar un sitio web con los archivos recientemente comprometidos.

Un script de gancho es un script que se ejecuta en respuesta a una respuesta a eventos de repositorio ( SVN Book: Create hooks ).


Una vez que eliminó el archivo de su revisión HEAD, no se ralentiza la velocidad de operación ya que se manejan los deltas pequeños entre las revisiones. (Las copias de seguridad del repositorio deben, por supuesto, manejar la carga).