Cuando usas
git rm --cached myfile
no se elimina del sistema de archivos local, que es el objetivo. Pero si ya ha versionado y confirmado el archivo, lo empujó a un repositorio central y lo introdujo en otro repositorio antes de usar el comando, eliminará el archivo de ese sistema.
¿Hay alguna manera de eliminar el archivo de las versiones sin eliminarlo de ningún sistema de archivos?
Editar: Aclarado, espero.
git
version-control
gitignore
git-rm
Fletcher Moore
fuente
fuente
Respuestas:
No creo que una confirmación de Git pueda registrar una intención como "detener el seguimiento de este archivo, pero no lo elimine".
La habilitación de tal intención requerirá la intervención fuera de Git en cualquier repositorio que se fusione (o rebase) en una confirmación que elimine el archivo.
Guardar una copia, aplicar eliminación, restaurar
Probablemente, lo más fácil es decirles a los usuarios intermedios que guarden una copia del archivo, eliminen y luego restauren el archivo. Si están tirando a través de rebase y están 'llevando' modificaciones al archivo, obtendrán conflictos. Para resolver tales conflictos, use
git rm foo.conf && git rebase --continue
(si la confirmación en conflicto tiene cambios además de los del archivo eliminado) ogit rebase --skip
(si la confirmación en conflicto solo ha cambiado en el archivo eliminado).Restaurar archivo como no rastreado después de extraer un commit que lo elimina
Si ya han retirado su confirmación de eliminación, aún pueden recuperar la versión anterior del archivo con git show :
O con git checkout (por comentario de William Pursell; ¡pero recuerda volver a eliminarlo del índice!):
Si han tomado otras medidas desde que eliminaste la eliminación (o si presionan con rebase en un HEAD separado), es posible que necesiten algo más que no sea
@{1}
. Podrían usargit log -g
para encontrar la confirmación justo antes de que retiraran su eliminación.En un comentario, usted menciona que el archivo que desea "destrabar, pero mantener" es algún tipo de archivo de configuración que se requiere para ejecutar el software (directamente desde un repositorio).
Mantener el archivo como 'predeterminado' y activarlo manual / automáticamente
Si no es completamente inaceptable para seguir manteniendo el contenido del archivo de configuración en el repositorio, es posible que pueda cambiar el nombre del archivo de seguimiento a partir de (por ejemplo)
foo.conf
afoo.conf.default
y luego indicar a los usuarios quecp foo.conf.default foo.conf
después de aplicar el cambio de nombre cometió. O, si los usuarios ya usan alguna parte existente del repositorio (por ejemplo, un script o algún otro programa configurado por el contenido en el repositorio (por ejemplo,Makefile
o similar)) para iniciar / implementar su software, puede incorporar un mecanismo predeterminado en el inicio / proceso de despliegue:Con un mecanismo de este tipo morosos en su lugar, los usuarios deben ser capaces de tirar de una confirmación de que cambia el nombre
foo.conf
afoo.conf.default
sin tener que hacer ningún trabajo adicional. Además, evita tener que copiar manualmente un archivo de configuración si realiza instalaciones / repositorios adicionales en el futuro.Reescribir el historial requiere intervención manual de todos modos ...
Si es inaceptable mantener el contenido en el repositorio, es probable que desee erradicarlo completamente del historial con algo como esto
git filter-branch --index-filter …
. Esto equivale a reescribir la historia, lo que requerirá una intervención manual para cada rama / repositorio (ver sección “Recuperación de aguas arriba Rebase” en el git rebase página del manual ). El tratamiento especial requerido para su archivo de configuración sería solo otro paso que uno debe realizar mientras se recupera de la reescritura:Ignórelo para evitar la recurrencia
Independientemente del método que utilice, es probable que desee incluir el nombre de archivo de configuración en un
.gitignore
archivo en el repositorio para que nadie puedagit add foo.conf
volver a darse cuenta sin darse cuenta (es posible, pero requiere-f
/--force
). Si tiene más de un archivo de configuración, puede considerar 'moverlos' a un solo directorio e ignorar todo (al 'mover' me refiero a cambiar el lugar donde el programa espera encontrar sus archivos de configuración y obtener los usuarios (o el mecanismo de lanzamiento / despliegue) para copiar / mover los archivos a su nueva ubicación; obviamente no querrá colocar un archivo en un directorio que ignorará).fuente
--{,no-}assume-unchanged
es puramente local: su estado no se registra directamente en commits. Puede ayudar a evitar que un repositorio confirme nuevos cambios en el archivo, pero no lo elimina del control de versiones. Si se puede establecer para todas sus relacionados repositorios relevantes, no desnudo, entonces puede ayudar a su situación, pero no es algo que se podía directamente empujar + tirón / rebase en otros repositorios relacionados, no desnudos (especialmente los que usted no controla, según los comentarios aclaratorios del autor de la pregunta original sobre la pregunta: ver "sistemas de personas" / "sistemas extranjeros").I do not think a Git commit can record an intention like “stop tracking this file, but do not delete it”.
- ahora puede, congit rm --cached foo.conf
Tuve el mismo problema esta semana cuando accidentalmente cometí, luego intenté eliminar un archivo de compilación de un repositorio compartido, y esto:
http://gitready.com/intermediate/2009/02/18/tempomporary-ignoring-files.html
ha funcionado bien para mí y no se menciona hasta ahora.
Para eliminar el archivo que le interesa del control de versiones, use todos los demás comandos de manera normal.
Si alguna vez quisiste volver a ponerlo.
Editar: consulte los comentarios de Chris Johnsen y KPM, esto solo funciona localmente y el archivo permanece bajo control de versión para otros usuarios si no lo hacen también. La respuesta aceptada proporciona métodos más completos / correctos para tratar esto. También algunas notas del enlace si usa este método:
fuente
Para eliminar el archivo del índice, use:
Esto no debería afectar su copia local ni la de nadie más.
fuente
reset
solo elimina el archivo del índice si el archivo no está en la confirmación HEAD actual; de lo contrario, solo revierte la versión del índice a la versión HEAD actual.git rm --cached remove_file
git add .gitignore
git commit -m "Excluding"
fuente
Después de ejecutar el
git rm --cached
comando, intente agregarlomyfile
al.gitignore
archivo (cree uno si no existe). Esto debería decirle a git que ignoremyfile
.El
.gitignore
archivo está versionado, por lo que deberá confirmarlo y enviarlo al repositorio remoto.fuente
Mi solución es extraer la otra copia de trabajo y luego hacer:
que dice obtener todas las rutas de archivo en el último comentario y verificarlas desde el padre de HEAD. Trabajo hecho.
fuente
Las soluciones anteriores funcionan bien para la mayoría de los casos. Sin embargo, si también necesita eliminar todos los rastros de ese archivo (es decir, datos confidenciales como contraseñas), también querrá eliminarlo de todo su historial de confirmación, ya que el archivo aún podría recuperarse desde allí.
Aquí hay una solución que elimina todos los rastros del archivo de todo su historial de confirmación, como si nunca existiera, pero mantiene el archivo en su lugar en su sistema.
https://help.github.com/articles/remove-sensitive-data/
En realidad, puede saltar al paso 3 si está en su repositorio git local y no necesita realizar una ejecución en seco. En mi caso, solo necesitaba los pasos 3 y 6, ya que había creado mi archivo .gitignore y estaba en el repositorio en el que quería trabajar.
Para ver sus cambios, es posible que deba ir a la raíz de GitHub de su repositorio y actualizar la página. Luego navegue a través de los enlaces para llegar a una confirmación anterior que alguna vez tuvo el archivo, para ver que ahora se ha eliminado. Para mí, simplemente actualizar la página de confirmación anterior no mostró el cambio.
Al principio parecía intimidante, pero realmente, ¡fue fácil y funcionó de maravilla! :-)
fuente