Nota: fallengamer hizo algunas pruebas en 2011 (por lo que pueden estar desactualizadas), y aquí están sus hallazgos :
Operaciones
- El archivo se cambia tanto en el repositorio local como en sentido ascendente
git pull
:
Git conserva los cambios locales de todos modos.
Por lo tanto, no perderá accidentalmente ningún dato que haya marcado con ninguna de las banderas.
- Archivo con
assume-unchanged
bandera: Git no sobrescribiría el archivo local. En cambio, generaría conflictos y consejos sobre cómo resolverlos
- Archivo con
skip-worktree
bandera: Git no sobrescribiría el archivo local. En cambio, generaría conflictos y consejos sobre cómo resolverlos
- El archivo se cambia tanto en el repositorio local como en sentido ascendente, tratando de extraer de todos modos
Usando los resultados en un trabajo manual adicional, pero al menos no perderías ningún dato si tuvieras algún cambio local.
git stash
git pull
skip-worktree
- Archivo con
assume-unchanged
bandera: descarta todos los cambios locales sin posibilidad de restaurarlos. El efecto es como ' git reset --hard
'. ' git pull
' la llamada tendrá éxito
- Archivo con
skip-worktree
bandera: Stash no funcionaría en skip-worktree
archivos. ' git pull
' fallará con el mismo error que el anterior. El desarrollador se ve obligado a restablecer manualmente el skip-worktree
indicador para poder ocultar y completar el error pull
.
- Sin cambios locales, se modificó el archivo ascendente
Ambas banderas no le impedirán obtener cambios ascendentes. Git detecta que incumpliste la promesa y elige reflejar la realidad al restablecer la bandera.
git pull
assume-unchanged
- Archivo con
assume-unchanged
bandera: el contenido se actualiza, la bandera se pierde.
' git ls-files -v
' mostraría que la bandera se modifica a H
(desde h
).
- Archivo con
skip-worktree
bandera: el contenido se actualiza, la bandera se conserva.
' git ls-files -v
' mostraría la misma S
bandera que antes pull
.
- Con el archivo local cambiado,
Git no toca el archivo y refleja la realidad (el archivo prometió que no se modificó realmente fue cambiado) para el archivo.
git reset --hard
skip-worktree
assume-unchanged
- Archivo con
assume-unchanged
bandera: se revierte el contenido del archivo. La bandera se restablece a H
(desde h
).
- Archivo con
skip-worktree
bandera: el contenido del archivo está intacto. La bandera sigue siendo la misma.
Agrega el siguiente análisis:
Parece que se skip-worktree
está esforzando mucho por preservar sus datos locales . Pero no le impide obtener cambios aguas arriba si es seguro. Además, git no restablece la bandera pull
.
Pero ignorar el reset --hard
comando ' ' podría convertirse en una desagradable sorpresa para un desarrollador.
Assume-unchanged
La bandera podría perderse en la pull
operación y los cambios locales dentro de dichos archivos no parecen ser importantes para git.
Ver:
Él concluye:
En realidad, ninguna de las banderas es lo suficientemente intuitiva .
assume-unchanged
asume que un desarrollador no debería cambiar un archivo. Si se modificó un archivo, ese cambio no es importante. Este indicador está destinado a mejorar el rendimiento de las carpetas que no cambian, como los SDK.
Pero si la promesa se rompe y se cambia un archivo, git revierte la bandera para reflejar la realidad. Probablemente esté bien tener algunos indicadores inconsistentes en carpetas generalmente no destinadas a ser cambiadas.
Por otro lado, skip-worktree
es útil cuando le indica a git que no toque nunca un archivo específico. Eso es útil para un archivo de configuración ya rastreado.
El repositorio principal ascendente aloja algunas configuraciones listas para producción, pero le gustaría cambiar algunas configuraciones en la configuración para poder hacer algunas pruebas locales. Y no desea verificar accidentalmente los cambios en dicho archivo para afectar la configuración de producción. En ese caso skip-worktree
hace escena perfecta.
Con Git 2.25.1 (febrero de 2020), el "En realidad ninguna de las banderas es lo suficientemente intuitiva" mencionado anteriormente se aclara más:
Ver commit 7a2dc95 , commit 1b13e90 (22 de enero de 2020) por brian m. carlson ( bk2204
) .
(Fusionada por Junio C Hamano - gitster
- en commit 53a8329 , 30 de enero de 2020)
( Lista de correo de Git )
doc
: disuade a los usuarios de intentar ignorar los archivos rastreados
Firmado por: Jeff King
Firmado por: brian m. carlson
Es bastante común que los usuarios deseen ignorar los cambios en un archivo que Git rastrea.
Los escenarios comunes para este caso son las configuraciones IDE y los archivos de configuración, que generalmente no deben rastrearse y posiblemente generarse a partir de archivos rastreados utilizando un mecanismo de plantillas.
Sin embargo, los usuarios aprenden acerca de los bits de asumir-sin cambios y omitir-árbol de trabajo e intentan usarlos para hacer esto de todos modos.
Esto es problemático, porque cuando se establecen estos bits, muchas operaciones se comportan como el usuario espera, pero generalmente no ayudan cuando se git checkout
necesita reemplazar un archivo.
No hay un comportamiento sensible en este caso, porque a veces los datos son preciosos, como ciertos archivos de configuración, y a veces son datos irrelevantes que el usuario estaría encantado de descartar.
Dado que esta no es una configuración compatible y los usuarios son propensos a hacer un mal uso de las funciones existentes para fines no deseados, causando tristeza y confusión general , documentemos el comportamiento existente y las trampas en la documentación para git update-index
que los usuarios sepan que deben explorar soluciones alternativas.
Además, proporcionemos una solución recomendada para tratar el caso común de los archivos de configuración, ya que existen enfoques bien conocidos que se utilizan con éxito en muchos entornos.
La git update-index
página del manual ahora incluye:
Los usuarios a menudo intentan usar los bits assume-unchanged
y skip-worktree
para decirle a Git que ignore los cambios en los archivos que se rastrean. Esto no funciona como se esperaba, ya que Git aún puede verificar los archivos de árbol de trabajo contra el índice al realizar ciertas operaciones. En general, Git no proporciona una forma de ignorar los cambios en los archivos rastreados, por lo que se recomiendan soluciones alternativas.
Por ejemplo, si el archivo que desea cambiar es algún tipo de archivo de configuración, el repositorio puede incluir un archivo de configuración de muestra que luego puede copiarse en el nombre ignorado y modificarse. El repositorio puede incluso incluir un script para tratar el archivo de muestra como una plantilla, modificándolo y copiándolo automáticamente.
La última parte es lo que describo como un controlador de filtro de contenido típico basado en scripts de borrones / limpieza .
.gitignore
para fines similares. ¿Esta solución funcionaría para usted?