ver tipos tag qué que podemos modificados hacer hace existen etiquetas crear con archivos git

tipos - ¿qué podemos hacer con git diff?



Preservar archivos de git--assume-sin cambios entre registros de sucursales (4)

He estado usando git --assume-unchanged yacs/settings/development.py para ignorar mi archivo de configuración de base de datos local en mi rama de desarrollo. Pero cuando quiero cambiar de rama (para implementaciones), me sale un error de que todavía tengo cambios pendientes:

% git checkout production error: Your local changes to the following files would be overwritten by checkout: yacs/settings/development.py Please, commit your changes or stash them before you can switch branches. Aborting

Que es molesto La única forma en que sé cómo evitar esto sería esconderlo:

% git stash % git checkout production % git merge dev % ./deploy.sh % git checkout dev % git stash pop # On branch dev # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: yacs/settings/development.py #

¡Pero ahora está de vuelta en el índice otra vez (ugh)! ¿Hay una mejor alternativa a este flujo de trabajo?

[No me importa en particular si los cambios locales se mantienen localmente (es decir, está bien si es la rama de producción), simplemente no quiero que se envíe a un repositorio remoto.]


La solución que funcionó para mí fue usar --skip-worktree. Sin embargo, como en el caso anterior, tuve problemas para poder cambiar entre una rama marcada y la rama principal sin que git se quejara, incluso después de haber establecido el indicador --skip-worktree en el archivo cuyos cambios deseaba seguir siendo local.

Parece que se encontrará con este problema si realiza cambios en el archivo local solamente antes de ejecutar --skip-worktree, que es lo que me sucedió a mí.

Una solución sugerida, arriba, es agregar el archivo a your_repo/.git/info/exclude . Pero no quería agregar el archivo a la lista de exclusión, así que hice lo siguiente desde mi directorio de árbol de trabajo:

  1. cp <local-only_file> ~/
    • Copie el archivo que tiene sus cambios locales a un lugar seguro en el sistema de archivos
  2. git checkout <local-only_file>
    • en el árbol de trabajo, compruebe el archivo para que coincida con el archivo principal de la rama
  3. git update-index --skip-worktree -- <local-only_file>
  4. cp ~/<local-only_file> .
    • Copie el archivo en cuestión desde un lugar seguro de vuelta al árbol de trabajo
  5. git diff
    • no se deben mostrar cambios; si accedes al repositorio principal, no se incluyen cambios en <local-only_file> en el push

Lo que comencé a hacer fue crear un master de rama llamado private que tiene mis cambios locales; pensar en ello como una rama de proxy entre mi rama de trabajo y el maestro. Puedo modificar mi bifurcación de trabajo actual en privado cuando necesito mis cambios solo locales y tengo un par de alias en mi .gitconfig que automatizan mantenerme actualizado con el maestro. Cuando necesito unirme al dominio, mis alias se aseguran de volver a establecer la base --en primer lugar, el dominio privado de mi rama de trabajo.

Publiqué una entrada de blog sobre esto con más detalle aquí http://blog.ericwoodruff.me/2013/02/git-private-branch-pattern.html


Puedes probar ( git update-index man page ):

git update-index --skip-worktree -- path

El bit Skip-worktree se puede definir en una oración (larga): cuando se lee una entrada, si está marcada como skip-worktree, entonces Git simula que su versión de directorio de trabajo está actualizada y lee la versión de índice en su lugar.

Sin embargo, como se menciona en " git assume inmodificado vs skip worktree ":

Ambas opciones tienen problemas. --assume-unchanged reinicia cada vez que se descarta el índice (por ejemplo, git reset ), por lo que es probable que tarde o temprano te haga tropezar. Lo mismo ocurre con --skip-worktree .


este problema ocurre cuando el archivo omitido no es el mismo que el de la rama que está tratando de pagar o el que está tratando de extraer.