ver modificados log ignorar ejemplo descartar comandos cambios archivos and git version-control gitignore git-rm

modificados - Git: cómo eliminar el archivo del índice sin eliminar archivos de ningún repositorio



git ver archivos modificados (7)

  1. git rm --cached remove_file
  2. agregar archivo a gitignore
  3. git add .gitignore
  4. git commit -m "Excluding"
  5. Que te diviertas ;)

Cuando usas

git rm --cached myfile

no elimina del sistema de archivos local, que es el objetivo. Pero si ya ha versionado y comprometido el archivo, lo ha enviado a un repositorio central y lo ha insertado en otro repositorio antes de usar el comando, eliminará el archivo de ese sistema.

¿Hay alguna forma de eliminar el archivo del control de versiones sin eliminarlo de ningún sistema de archivos?

Editar: Aclarado, espero.


Después de git rm --cached comando git rm --cached , intente agregar .gitignore archivo .gitignore (cree uno si no existe). Esto debería decirle a git que ignore mi myfile .

El archivo .gitignore está versionado, por lo que .gitignore al repositorio remoto.


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 su historial de confirmaciones completo, ya que el archivo aún se puede recuperar desde allí.

Aquí hay una solución que elimina todos los rastros del archivo de todo el historial de confirmaciones, como si nunca hubiera existido, pero mantiene el archivo 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 los cambios, es posible que deba dirigirse 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 una vez tuvo el archivo, para ver que ya se eliminó. Para mí, simplemente actualizar la página de commit anterior no mostró el cambio.

Parecía intimidante al principio, pero realmente, ¡fue fácil y funcionó como un amuleto! :-)


Mi solución es tirar de la otra copia de trabajo y luego hacer:

git log --pretty="format:" --name-only -n1 | xargs git checkout HEAD^1

que dice obtener todas las rutas de archivos en el último comentario, y verifíquelas desde el padre de HEAD. Trabajo hecho.


No creo que un commit de Git pueda grabar una intención como "dejar de seguir este archivo, pero no lo elimine".

La promulgación de dicha intención requerirá la intervención fuera de Git en cualquier repositorio que combine (o rebase en) una confirmación que elimine el archivo.

Guardar una copia, aplicar eliminación, restaurar

Probablemente lo más fácil de hacer es decirle a los usuarios intermedios que guarden una copia del archivo, eliminen su eliminación 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 estos conflictos, use git rm foo.conf && git rebase --continue (si la confirmación en conflicto tiene cambios además de aquellos para el archivo eliminado) o git rebase --skip (si la confirmación conflictiva solo ha cambiado al archivo eliminado) .

Restaurar archivo como no rastreado después de extraer un compromiso 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 :

git show @{1}:foo.conf >foo.conf

O con el pago por git (por comentario de William Pursell, pero recuerde volver a eliminarlo del índice):

git checkout @{1} -- foo.conf && git rm --cached foo.conf

Si han realizado otras acciones desde que sacaste tu eliminación (o están tirando con rebase en un HEAD separado), es posible que necesiten algo más que @{1} . Podrían usar git log -g para encontrar la confirmación justo antes de que sacaran su eliminación.

En un comentario, mencionas que el archivo que deseas "desbloquear, pero conservar" 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 manualmente / automáticamente

Si no es completamente inaceptable continuar manteniendo el contenido del archivo de configuración en el repositorio, es posible que pueda cambiar el nombre del archivo rastreado de (por ejemplo) foo.conf a foo.conf.default y luego instruir a sus usuarios a cp foo.conf.default foo.conf después de aplicar la confirmación de cambio de nombre. O bien, si los usuarios ya usan alguna parte existente del repositorio (por ejemplo, un script o algún otro programa configurado por contenido en el repositorio (por ejemplo, Makefile o similar)) para iniciar / implementar su software, podría incorporar un mecanismo predeterminado en el lanzamiento / deploy process:

test -f foo.conf || test -f foo.conf.default && cp foo.conf.default foo.conf

Con un mecanismo de incumplimiento de este tipo implementado, los usuarios deberían poder extraer un compromiso que foo.conf nombre de foo.conf a foo.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 una intervención manual de todos modos ...

Si no es aceptable mantener el contenido en el repositorio, es probable que desee erradicarlo por completo de la historia con algo como git filter-branch --index-filter … Esto equivale a reescribir el historial, lo que requerirá una intervención manual para cada sucursal / repositorio (consulte la sección "Recuperación de la recuperación de la versión preliminar" en la página de manual de git rebase ). 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:

  1. Guarde una copia del archivo de configuración.
  2. Recuperarse de la reescritura.
  3. Restaure el archivo de configuración.

Ignorarlo para evitar la recurrencia

Cualquiera que sea el método que use, probablemente quiera incluir el nombre de archivo de la configuración en un archivo .gitignore en el repositorio para que nadie pueda git add foo.conf inadvertidamente git add foo.conf nuevamente (es posible, pero requiere -f / --force ). Si tiene más de un archivo de configuración, podría considerar moverlos a todos en un solo directorio e ignorar todo (al decir "mover" me refiero a cambiar dónde el programa espera encontrar sus archivos de configuración y cómo obtener los usuarios (o el mecanismo de inicio / implementación) para copiar / mover los archivos a su nueva ubicación, obviamente no querrás poner mi archivo en un directorio que estarás ignorando.


Para eliminar el archivo del índice, use:

git reset myfile

Esto no debería afectar su copia local o la de otra persona.


Tuve el mismo problema esta semana cuando accidentalmente me comprometí, luego traté de eliminar un archivo de compilación de un repositorio compartido, y esto:

http://gitready.com/intermediate/2009/02/18/temporarily-ignoring-files.html

funcionó bien para mí y no se mencionó hasta ahora.

git update-index --assume-unchanged <file>

Para eliminar el archivo que le interesa desde el control de la versión, utilice todos los demás comandos como de costumbre.

git update-index --no-assume-unchanged <file>

Si alguna vez quisiste volver a ponerlo

Editar: vea los comentarios de Chris Johnsen y KPM, esto solo funciona localmente y el archivo permanece bajo el control de la versión para otros usuarios si no lo hacen también. La respuesta aceptada proporciona métodos más completos / correctos para tratar con esto. También algunas notas del enlace si usa este método:

Obviamente, hay algunas advertencias que entran en juego con esto. Si agrega el archivo directamente, se agregará al índice. Si combina una confirmación con este indicador, la fusión fallará correctamente para que pueda manejarla manualmente.