ver - ¿Cómo detener el seguimiento e ignorar los cambios en un archivo en Git?
ver cambios en un archivo git (15)
¿Olvidó su .gitignore?
Si tiene el proyecto completo localmente pero olvidó agregarlo, git ignore y ahora está rastreando algunos archivos innecesarios, use este comando para eliminar todo.
git rm --cached -r .
Asegúrate de estar en la raíz del proyecto.
Entonces puedes hacer lo habitual.
Añadir
git add .
Cometer
git commit -m ''removed all and added with git ignore''
empujar
git push origin master
Conclusión
Espero que esto ayude a las personas que tienen que hacer cambios en su .gitignore
u .gitignore
todo junto.
- Se elimina todo el caché.
- Mira tu .gitignore
- Agrega los archivos que quieres rastrear
- Empuja a tu repo
He clonado un proyecto que incluye algunos archivos .csproj
. No necesito / me gustan mis archivos csproj
locales que csproj
siendo rastreados por Git (o que aparecen cuando se crea un parche), pero claramente son necesarios en el proyecto.
He agregado *.csproj
a mi LOCAL .gitignore
, pero los archivos ya están en el repositorio.
Cuando escribo el estado de git, muestra mis cambios en csproj
que no estoy interesado en hacer un seguimiento de los parches o enviarlos.
¿Cómo elimino el "seguimiento de" estos archivos de mi repositorio personal (pero los guardo en la fuente para poder usarlos) para que no vea los cambios cuando hago un estado (o creo un parche)?
¿Hay una manera correcta / canónica de manejar esta situación?
Como se señaló en otras respuestas, la respuesta seleccionada es incorrecta.
La answer a otra pregunta sugiere que puede ser necesario omitir worktree.
git update-index --skip-worktree <file>
El problema puede ser causado por el orden de operación. Si primero modificó .gitignore, luego git rm --cached xxx, es posible que tenga que seguir encontrando este problema.
Solución correcta:
- git rm - acoplado xxx
- modificado el .gitignore
Orden invariante!
El .gitignore recargar después de la modificación!
Este es un proceso de dos pasos:
Elimine el seguimiento del archivo / carpeta, pero manténgalos en el disco, utilizando
git rm --cached
Ahora no se muestran como "cambiados", pero aún se muestran como
untracked files in git status -u
.gitignore
a.gitignore
La respuesta aceptada todavía no funcionó para mí.
solía
git rm -r --cached.
git añadir.
git commit -m "corrigiendo .gitignore"
Encontré la respuesta desde here
Mucha gente le recomienda usar git update-index --assume-unchanged
. De hecho, esta puede ser una buena solución, pero solo a corto plazo.
Lo que probablemente quieras hacer es esto: git update-index --skip-worktree
.
(La tercera opción, que probablemente no desee, es: git rm --cached
. Conservará su archivo local, pero se marcará como eliminado del repositorio remoto).
¿Diferencia entre las dos primeras opciones?
-
assume-unchanged
es para permitirle temporalmente ocultar modificaciones de un archivo. Si desea ocultar las modificaciones hechas a un archivo, modifíquelo y luego seleccione otra rama, tendrá que usar las modificaciones no ocultasno-assume-unchanged
y probablemente ocultas. -
skip-worktree
lo seguirá independientemente de la sucursal queskip-worktree
el pago, ¡con sus modificaciones!
Caso de uso de assume-unchanged
Asume que este archivo no debe modificarse, y le proporciona una salida más limpia al hacer el git status
. Pero cuando se retira a otra rama, necesita restablecer la bandera y confirmar o guardar cambios antes de eso. Si tira con esta opción activada, necesitará resolver conflictos y git no se fusionará automáticamente. En realidad, solo oculta las modificaciones (el git status
no le mostrará los archivos marcados).
Me gusta usarlo cuando solo quiero detener el seguimiento de los cambios por un tiempo + confirmar un montón de archivos ( git commit -a
) relacionados con la misma modificación.
Caso de uso de skip-worktree
Tiene una clase de configuración que contiene parámetros (por ejemplo, incluyendo contraseñas) que sus amigos deben cambiar de acuerdo con su configuración.
- 1: Cree una primera versión de esta clase, complete los campos que puede completar y deje otros vacíos / nulos.
- 2: Confirme y empuje al servidor remoto.
- 3:
git update-index --skip-worktree MySetupClass.java
- 4: Actualice su clase de configuración con sus propios parámetros.
- 5: Volver a trabajar en otra funcionalidad.
Las modificaciones que hagas te seguirán cualquiera que sea la rama. Advertencia: si sus amigos también desean modificar esta clase, deben tener la misma configuración, de lo contrario, sus modificaciones se enviarán al repositorio remoto. Al tirar, la versión remota del archivo debe sobrescribir la suya.
PD: haz una o la otra, pero no ambas, ya que tendrás efectos secundarios indeseables. Si desea probar otro indicador, primero debe desactivar este último.
Para ahorrar algo de tiempo, las reglas que agregue a su .gitignore se pueden usar para eliminar múltiples archivos / carpetas, es decir,
git rm --cached app/**/*.xml
o
git rm --cached -r app/widgets/yourfolder/
etc
Para decirle a Git que no haga un seguimiento de los cambios en su archivo / carpeta local (lo que significa que el estado de git no detectará cambios en él), haga lo siguiente:
git update-index --skip-worktree path/to/file
Y para decirle a Git que haga un seguimiento de los cambios en su versión local una vez más (para que pueda confirmar los cambios), haga:
git update-index --no-skip-worktree path/to/file
Para evitar monitorizar un archivo por git
git update-index --assume-unchanged [file-path]
Y para revertirlo volveremos a utilizarlo.
git update-index --no-assume-unchanged [file-path]
Para ignorar cualquier cambio en todos los archivos (de cierto tipo) en un directorio, tuve que combinar algunos de estos enfoques, de lo contrario los archivos se crearían si no existían previamente.
A continuación, "excludedir" es el nombre del directorio que no deseo ver los cambios.
Primero, elimine cualquier archivo nuevo existente de su caché de seguimiento de cambios (sin eliminar de su sistema de archivos).
git status | grep "new file:" | cut --complement -d " " -f1-4 | grep "^excludedir" | xargs git rm --cache
Puedes hacer lo mismo con los modified:
renamed:
es un poco más complicado, ya que tendrá que mirar el post ->
bit para el nuevo nombre de archivo, y hacer el pre ->
bit como se describe para deleted:
continuación.
deleted:
archivos resultan un poco más complicados, ya que parece que no puede actualizar el índice de un archivo que no existe en el sistema local
echo .deletedfiles >> .gitignore
git status | grep "deleted:" | cut --complement -d " " -f1-4 | grep "^excludedir" > .deletedfiles
cat .deletedfiles | xargs -d ''/n'' touch
cat .deletedfiles | xargs -d ''/n'' git add -f
cat .deletedfiles | xargs -d ''/n'' git update-index --assume-unchanged
cat .deletedfiles | xargs -d ''/n'' rm
El último comando en la lista anterior eliminará los archivos nuevamente de su sistema de archivos, así que siéntase libre de omitir eso.
Luego, bloquee el seguimiento de cambios desde ese directorio
git ls-files excludedir/ | xargs git update-index --skip-worktree
git update index --skip-worktree excludedir/
Si realiza git update-index --assume-unchanged file.csproj
, git no buscará cambios automáticamente en el archivo.csproj: eso evitará que aparezcan en el estado de git cada vez que los cambie. Por lo tanto, puede marcar todos sus archivos .csproj de esta manera, aunque tendrá que marcar manualmente los nuevos que le envíe el repositorio ascendente. (Si los tiene en su .gitignore
o .git/info/exclude
, entonces los que cree serán ignorados)
No estoy completamente seguro de qué son los archivos .csproj ... si son algo parecido a las configuraciones IDE (similares a los archivos .eclipse y .classpath de Eclipse), entonces sugeriría que nunca deberían ser controlados por la fuente en todos. Por otro lado, si son parte del sistema de compilación (como Makefiles) entonces claramente deberían --- y una manera de recoger cambios locales opcionales (por ejemplo, de un local.csproj a la config.mk) sería útil : divide la acumulación en partes globales y sustituciones locales.
Simplemente llamar git rm --cached
en cada uno de los archivos que desea eliminar del control de revisión debería estar bien. Mientras los patrones de ignorar locales sean correctos, no verá estos archivos incluidos en la salida del estado de git.
Tenga en cuenta que esta solución elimina los archivos del repositorio, por lo que todos los desarrolladores necesitarían mantener sus propias copias locales (no controladas por la revisión) del archivo
Para evitar que git detecte cambios en estos archivos, también debe usar este comando:
git update-index --assume-unchanged [path]
Lo que probablemente quieras hacer: (de abajo la respuesta de @Ryan Taylor )
- Esto es para decirle a Git que quieres tu propia versión independiente del archivo o carpeta. Por ejemplo, no desea sobrescribir (o eliminar) los archivos de configuración de producción / organización.
git update-index --skip-worktree <path-name>
La respuesta completa está aquí en esta URL: http://source.kohlerville.com/2009/02/untrack-files-in-git/
Supongo que está intentando eliminar un solo archivo de git tacking. Para eso recomendaría a continuación el comando.
git update-index - asume-unchanged
Ex - git update-index --assume-unchanged .gitignore .idea / compiler.xml
Supongo que está preguntando cómo eliminar TODOS los archivos en una carpeta específica o en la carpeta bin, en lugar de seleccionar cada archivo por separado.
Puedes usar este comando:
git rm -r -f /<floder-name>/*
Asegúrese de estar en el directorio principal de ese directorio.
Este comando "recursivamente" eliminará "todos los archivos que se encuentran en el contenedor / o en las compilaciones / carpetas. Con la palabra eliminar, quiero decir que git fingirá que esos archivos se "eliminan" y que esos archivos no serán rastreados. El git realmente marca esos archivos para estar en modo de eliminación.
Asegúrese de tener su .gitignore listo para los próximos envíos.
Documentación: git rm
Hay 3 opciones, probablemente quieras # 3
1. Esto mantendrá el archivo local para usted, pero lo eliminará para cualquier otra persona cuando lo saque.
git rm --cached <file-name>
o git rm -r --cached <folder-name>
2. Esto es para la optimización, como una carpeta con una gran cantidad de archivos, por ejemplo, SDK que probablemente nunca cambiarán. Le dice a git que deje de revisar esa enorme carpeta cada vez que haya cambios, localmente, ya que no tendrá ninguno. El índice de assume-unchanged
se restablecerá y los archivos se sobrescribirán si hay cambios en el flujo ascendente en el archivo / carpeta (cuando se extrae).
git update-index --assume-unchanged <path-name>
3. Esto es para decirle a git que desea su propia versión independiente del archivo o carpeta. Por ejemplo, no desea sobrescribir (o eliminar) los archivos de configuración de producción / organización.
git update-index --skip-worktree <path-name>
Es importante saber que git update-index
no se propagará con git, y cada usuario tendrá que ejecutarlo de forma independiente.