source - Cómo "deshacer" la conversión de un archivo en svn y/o git
version control git (15)
Me pasa todo el tiempo. Accidentalmente versiono un archivo, no quiero ser versionado (es decir, archivos de configuración específicos del desarrollador / máquina).
Si confirmo este archivo, voy a desordenar las rutas en todas las otras máquinas de desarrollo; no estarán contentos.
Si elimino el archivo del control de versiones, se eliminará de las otras máquinas de desarrollo; no estarán contentos.
Si elijo nunca comprometer el archivo, siempre tengo un pago "sucio"; no estoy contento.
¿Es una forma limpia de "desvertir" un archivo del control de revisión, que dará como resultado que nadie esté descontento?
editar: tratando de aclarar un poco: ya he enviado el archivo al repositorio y solo quiero eliminarlo del control de versiones: específicamente, no quiero que se elimine físicamente de todos los que hacen el pago. Inicialmente quería que se ignorara.
Respuesta: Si pudiera aceptar una segunda respuesta, sería this . Responde mi pregunta con respecto a git: la respuesta aceptada es sobre svn.
He escogido nunca comprometer el archivo, siempre tengo un pago "sucio" - No estoy contento.
Con respecto a este punto en particular, es posible que desee .gitignore
el archivo como otros han sugerido, o utilizar un esquema como el que se describe en esta respuesta mía.
Busque svn: ignore y .gitignore: estas características le permiten tener archivos adicionales en su pago que su RCS ignora (cuando realiza una operación de "estado" o lo que sea).
Para los archivos de configuración específicos de la máquina, una buena opción es verificar en un archivo nombrado con una extensión adicional ".sample", es decir. config.xml.sample
. Los desarrolladores individuales harían una copia de este archivo en config.xml
y lo modificarían para su sistema. Con svn: ignore o .gitignore, puede asegurarse de que el archivo config.xml
no versionado no se muestre como sucio todo el tiempo.
En respuesta a su edición: si elimina el archivo del repositorio ahora, sus desarrolladores tendrán un conflicto la próxima vez que realicen una actualización (suponiendo que todos hayan cambiado el archivo de su sistema). No perderán sus cambios locales, serán recuperables de alguna parte. Si no han realizado ningún cambio local, su archivo de configuración se desvanecerá, pero pueden volver a sacar el anterior del control de código fuente y usarlo.
Dos pasos simples en SVN:
1. Agregue este directorio en la propiedad svn: ignore del directorio padre:
svn propedit svn:ignore .
2. Eliminar el directorio:
svn rm mydir
3. Cometer
Tenga en cuenta que cuando otros desarrolladores hacen una actualización de svn , ese directorio no se eliminará. SVN simplemente lo invierte en su lugar.
En Git, para eliminarlo del árbol, pero NO del directorio de trabajo, que creo que es lo que quieres, puedes usar el indicador --cached, es decir:
git rm --cached <filename>
En Windows, si lo que está buscando es copiar la carpeta a otra ubicación y eliminarla de git, para que ya no vea los iconos, simplemente elimine la carpeta .git. La carpeta .git está oculta, por lo que debe ir a la opción Organizar / Carpeta y Opciones de búsqueda, Mostrar archivos ocultos, debajo de su carpeta principal. Debería desversionarlo.
Hasta donde sé, no hay una manera fácil de eliminar un archivo agregado del control de versiones en svn una vez que se haya confirmado.
Deberá guardar el archivo en otro lugar y eliminarlo del control de versión. Que copiar la copia de seguridad de nuevo.
Es un sistema de control de versiones después de todo ...;)
Para SVN puedes revertir archivos que aún no has cometido. En TortoiseSVN, simplemente haga clic derecho en el archivo en la ventana de confirmación y seleccione Revertir ...
En la línea de comando use svn revert [file]
No sé sobre GIT ya que nunca lo he usado.
Para eliminar un archivo completamente de un repositorio de git (supongamos que ha enviado un archivo con una contraseña o ha cometido accidentalmente archivos temporales)
git filter-branch --index-filter ''git update-index --remove filename'' HEAD
Entonces creo que tienes que comprometer, y presionar -f si está en sucursales remotas (recuerda que podría molestar a las personas si comienzas a cambiar el historial del repositorio ... y si ya se han desconectado de ti, aún podrían tener el archivo)
Para eliminar un archivo que ya está en control de fuente:
git rm <filename>
y entonces
git commit -m ...
Debe agregar todos los archivos que desee ignorar al archivo .gitignore. Además, siempre compruebo el archivo .gitignore en mi repositorio, por lo que si alguien revisa el código en su máquina y el archivo se genera nuevamente, no lo "verá" como "sucio".
Por supuesto, si ya comprometió el archivo y alguien más obtuvo sus cambios en otra máquina, tendría que modificar cada repositorio local para modificar el historial. Al menos esa es una posible solución con git. No creo que svn te permita hacer eso.
Si el archivo ya está en el repositorio principal (git) o en el servidor (svn), no creo que haya una solución mejor que simplemente borrar el archivo en otra confirmación.
Parece que ya ha agregado y comprometido el archivo a la subversión (supongo que está utilizando Subversion). Si ese es el caso, solo hay dos formas de eliminar ese archivo:
- Marque el archivo como eliminado y confirme.
- Realice un
svnadmin dump
, filtre la revisión en la que accidentalmente confirmó el archivo y realice unasvnadmin load
.
Créanme, realmente no quieren hacer el número 2. Anulará todas las copias de trabajo del repositorio. Lo mejor es hacer el número 1, marcar el archivo como ignorado y disculparse.
Puede desinstalar todos los archivos en el directorio actual con este comando. El bit sed
invierte el orden para que svn pueda procesarlo:
find . | sed ''1!G;h;$!d''| awk ''{print "svn rm --keep-local " $1}''
Como ya se indicó en otras respuestas, el archivo único no se ha versionado con esto:
svn rm --keep-local yourFileNameXXX
Puede excluir archivos de la subversión con la configuración de ignorar global
http://svnbook.red-bean.com/en/1.1/ch07.html#svn-ch-7-sect-1.3.2
echa un vistazo a la documentación para más detalles
SVN versión 1.5 admite la eliminación / eliminación de un archivo de un repositorio sin perder el archivo local
tomado de http://subversion.tigris.org/svn_1.5_releasenotes.html
Nueva opción "keep-local" conserva la ruta después de eliminar ..
Eliminar (eliminar) ahora toma una opción --keep-local para mantener sus destinos localmente, por lo que las rutas no se eliminarán, incluso si no se modifican.
Si accidentalmente ''agregas'' un archivo en svn y no lo has comprometido, puedes revertir ese archivo y eliminará el agregado.
Sin haberlo probado ...
En git, si tus cambios no han sido propagados a otro repositorio, deberías poder git rm
los archivos afectados, git rebase --interactive
para reordenar el compromiso de eliminación justo después del commit en el que accidentalmente has agregado los archivos ofensivos, y luego aplastar esos dos commits juntos.
Por supuesto, esto no ayudará si alguien más ha retirado sus cambios.