He clonado un proyecto que incluye algunos .csproj
archivos. No necesito / me gusta que mis csproj
archivos locales sean rastreados por Git (o que aparezcan al crear un parche), pero claramente son necesarios en el proyecto.
Yo he añadido *.csproj
a mi LOCAL .gitignore
, pero los archivos ya están en el repositorio.
Cuando escribo el estado de git, muestra mis cambios a csproj
que no estoy interesado en realizar un seguimiento o enviar parches.
¿Cómo elimino el "seguimiento" de estos archivos de mi repositorio personal (pero los mantengo 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?
.csproj
archivo, que es una parte muy importante de cualquier proyecto. Cambios en el.csproj.user
archivo o en cualquier.Publish.XML
archivo que entiendo totalmente sin seguimiento, pero estoy intrigado por qué no querría seguir el.csproj
...Respuestas:
Solo llamando
git rm --cached
a cada uno de los archivos que desea eliminar del control de revisión debería estar bien. Mientras sus patrones locales de ignorar 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 tendrían que mantener sus propias copias locales (sin revisión de revisión) del archivo
Para evitar que git detecte cambios en estos archivos, también debe usar este comando:
Lo que probablemente quieras hacer: (desde abajo @Ryan Taylor responde )
La respuesta completa está aquí en esta URL: http://source.kohlerville.com/2009/02/untrack-files-in-git/
fuente
git ls-files | xargs git rm --cached
eso eliminará todo del índice git en un directorio dado sin eliminar los archivos reales.git rm --cached -r <dir>
funciona de forma recursiva en una carpeta y todos los archivos que contiene.Si lo hace
git update-index --assume-unchanged file.csproj
, git no comprobará los cambios en file.csproj automáticamente: eso evitará que aparezcan en estado 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 tienes en tu.gitignore
o.git/info/exclude
, entonces los que crees serán ignorados)No estoy completamente seguro de qué son los archivos .csproj ... si son algo similar a las configuraciones de IDE (similar a los archivos .eclipse y .classpath de Eclipse), entonces sugeriría que simplemente nunca deberían controlarse en origen en todas. Por otro lado, si son parte del sistema de compilación (como Makefiles), entonces claramente deberían --- y una forma de recoger cambios locales opcionales (por ejemplo, desde un local.csproj a la config.mk) sería útil : divide la acumulación en partes globales y anulaciones locales.
fuente
.csproj
?git ls-files -v
mostrará los archivos que se suponen sin cambios con un indicador en minúsculas (por ejemplo, enh
lugar de lo habitualH
para los archivos en caché).Hay 3 opciones, probablemente quieras # 3
1. Esto mantendrá el archivo local para usted, pero lo eliminará para cualquier otra persona cuando lo extraigan.
git rm --cached <file-name>
ogit 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 verificar esa enorme carpeta cada vez por cambios, localmente, ya que no tendrá ninguno. El
assume-unchanged
índice se restablecerá y los archivos se sobrescribirán si hay cambios ascendentes en el archivo / carpeta (cuando se extrae).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 / preparación.
Es importante saber que
git update-index
no se propagará con git, y cada usuario tendrá que ejecutarlo de forma independiente.fuente
grep
ygit ls-files
it gives me error that your local changes would be overwritten
en esos 2 archivos, eso significa que no se está rastreando, ¿verdad?Este es un proceso de dos pasos:
Elimine el seguimiento del archivo / carpeta, pero manténgalos en el disco, utilizando
Ahora no se muestran como "cambiados" pero aún se muestran como
Añádelos a
.gitignore
fuente
La respuesta aceptada todavía no funcionó para mí.
solía
Encontré la respuesta desde aquí
fuente
¿Olvidaste tu .gitignore?
Si tiene todo el proyecto localmente pero olvidó agregarle git ignore y ahora está rastreando algunos archivos innecesarios, use este comando para eliminar todo
asegúrese de estar en la raíz del proyecto.
Entonces puedes hacer lo habitual
Añadir
Cometer
empujar
Conclusión
Espero que esto ayude a las personas que tienen que hacer cambios a ellos
.gitignore
o que se olvidaron de todo.fuente
Como se señaló en otras respuestas, la respuesta seleccionada es incorrecta.
La respuesta a otra pregunta sugiere que puede ser necesario omitir el árbol de trabajo.
fuente
--skip-worktree
se utiliza para mantener el archivo en el repositorio pero dejar de rastrear sus cambios . Como dice su respuesta: --skip-worktree es útil cuando le indica a git que no toque un archivo específico porque los desarrolladores deberían cambiarlo--assume-unchanged
y--skip-worktree
tener un efecto similar, pero sus propósitos son completamente diferentes. El primero es para acelerar el rendimiento de git engañando a git para que no revise archivos particulares , mientras que el segundo es para ignorar cambios futuros en archivos particulares , que son adecuados para el tiempo de ejecución pero archivos esenciales.Para ahorrar algo de tiempo, las reglas que agrega a su .gitignore pueden usarse para eliminar múltiples archivos / carpetas, es decir
git rm --cached app/**/*.xml
o
git rm --cached -r app/widgets/yourfolder/
etc.
fuente
Para evitar el monitoreo de un archivo por git
Y para revertirlo, usa
Un repositorio para referirse a casos de uso similares https://github.com/awslabs/git-secrets
fuente
Mucha gente te aconseja usar
git update-index --assume-unchanged
. De hecho, esta puede ser una buena solución, pero solo a corto plazo.Lo que es probable que desee hacer es lo siguiente:
git update-index --skip-worktree
.(La tercera opción, que probablemente no desee es:
git rm --cached
mantendrá su archivo local, pero se marcará como eliminado del repositorio remoto).¿Diferencia entre las dos primeras opciones?
assume-unchanged
es permitirle temporalmente ocultar modificaciones de un archivo. Si desea ocultar las modificaciones realizadas a un archivo, modifique el archivo, luego revise otra rama, tendrá que usarno-assume-unchanged
luego probablemente escondirá las modificaciones realizadas.skip-worktree
te seguirá, sea cual sea la rama que pagues, ¡con tus modificaciones!Caso de uso de
assume-unchanged
Asume que este archivo no debe modificarse, y le da una salida más limpia al hacerlo
git status
. Pero cuando se desprotege en otra rama, debe restablecer el indicador y confirmar o ocultar los cambios antes de hacerlo. Si tira con esta opción activada, deberá resolver conflictos y git no se fusionará automáticamente. En realidad, solo oculta modificaciones (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, contraseñas incluidas) que sus amigos deben cambiar de acuerdo con su configuración.
git update-index --skip-worktree MySetupClass.java
Las modificaciones que hagas te seguirán sea cual sea la rama. Advertencia: si sus amigos también quieren modificar esta clase, tienen que tener la misma configuración, de lo contrario, sus modificaciones se enviarían al repositorio remoto. Al tirar, la versión remota del archivo debe sobrescribir la suya.
PD: haz uno u otro, pero no ambos, ya que tendrás efectos secundarios indeseables. Si desea probar con otro indicador, primero debe desactivar el último.
fuente
Para decirle a Git que no rastree los cambios en su archivo / carpeta local (lo que significa que el estado de git no detectará cambios en él), haga lo siguiente:
Y para decirle a Git que rastree los cambios en su versión local una vez más (para que pueda confirmar los cambios), haga lo siguiente:
fuente
respuesta de una línea
git update-index --assume-unchanged [path]
Úselo siempre que tenga un archivo que esté en el repositorio central y también en el repositorio local. Debe realizar cambios en ese archivo pero no debe estar preparado / confirmado en el repositorio central. Este archivo no debe agregarse en
.gitignore
. Debido a que los administradores del sistema introducen nuevos cambios en el archivo, los desarrolladores principales deben distribuirse entre todos los repositorios locales.El mejor ejemplo: archivo de configuración para conexiones de base de datos . En un repositorio central, tendrá todo el nombre de usuario, contraseña, host, puerto con valores de un servidor de base de datos de producción. Pero en el desarrollo local, debe usar solo un servidor de base de datos de desarrollo local o cualquier otro (que su equipo haya configurado). En este caso, desea realizar cambios en el archivo de configuración, pero no debe comprometerse con el repositorio central.
Mejor
fuente
Supongo que está preguntando cómo eliminar TODOS los archivos en una carpeta específica o la carpeta bin, en lugar de seleccionar cada archivo por separado.
Puede usar este comando:
git rm -r -f /<floder-name>\*
asegúrese de estar en el directorio principal de ese directorio.
Este comando "borrará" recursivamente todos los archivos que están en las carpetas bin / o build /. Con la palabra eliminar me refiero a que git fingirá que esos archivos se "eliminan" y no se rastrearán esos archivos. El git realmente marca esos archivos para estar en modo de eliminación.
Asegúrate de tener tu .gitignore listo para los próximos commits.
Documentación: git rm
fuente
El problema puede ser causado por el orden de operación. Si modificó el .gitignore primero, luego git rm --cached xxx, es posible que deba continuar encontrando este problema.
Solución correcta:
Orden invariante!
¡La recarga de .gitignore después de la modificación!
fuente
Supongo que está tratando de eliminar un solo archivo de git tacking. para eso recomendaría el siguiente comando.
git update-index --asumir-sin cambios
Ex - git update-index --asum-sin cambios .gitignore .idea / compiler.xml
fuente
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 crearon si no existían previamente.
A continuación, "excludedir" es el nombre del directorio en el que no deseo ver los cambios.
Primero, elimine cualquier archivo nuevo existente de su caché de seguimiento de cambios (sin eliminarlo de su sistema de archivos).
Puedes hacer lo mismo con
modified:
.renamed:
es un poco más complicado, ya que tendrá que mirar el->
bit de publicación para el nuevo nombre de archivo y hacer el->
bit previo como se describe adeleted:
continuación.deleted:
los 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 localEl ú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
fuente
Se dio un enfoque casi libre de comandos git en esta respuesta :
Para ignorar ciertos archivos para cada repositorio local :
~/.gitignore_global
, por ejemplo,touch ~/.gitignore_global
en su terminal.git config --global core.excludesfile ~/.gitignore_global
por una vez.~/.gitignore_global
. por ejemplomodules/*.H
, que se supondrá que está en su directorio de trabajo, es decir$WORK_DIR/modules/*.H
.Para ignorar ciertos archivos para un único repositorio local :
.git/info/exclude
dentro del repositorio, es decir, escriba las rutas de archivo / directorio en las que desea ignorar.git/info/exclude
. por ejemplomodules/*.C
, que se supondrá que está en su directorio de trabajo, es decir$WORK_DIR/modules/*.C
.fuente
Aplicar .gitignore al presente / futuro
Si también necesita purgar los archivos recién ignorados del historial de confirmaciones de la rama o si no desea que los archivos ignorados recientemente se eliminen de futuras extracciones , consulte esta respuesta .
fuente
Después de buscar mucho tiempo, encuentre la manera de hacerlo. alias un comando git en
.gitconfig
.like en el proyecto de estudio de Android, antes de que la rama de pago revierta el archivo de configuración y luego lo omita, después de que la rama de pago use elsed
archivo de configuración de cambio a mi configuración local.checkoutandmodifylocalproperties = !git update-index --no-skip-worktree local.properties && git checkout local.properties && git checkout $1 && git update-index --skip-worktree local.properties && sed -i '' 's/.*sdk.dir.*/sdk.dir=\\/Users\\/run\\/Library\\/Android\\/sdk/g' local.properties && :
fuente