2012-03-22 8 views
30

He estado usando git --assume-unchanged yacs/settings/development.py hacer caso omiso de mi archivo de configuración de base de datos local en mi rama prog. Pero cuando quiero cambiar ramas (para implementaciones), me sale un error que todavía tengo pendiente de cambios:Preserve git archivos --assume-sin cambios entre las cajas de rama

% 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 

lo cual es molesto. La única forma que conozco de 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 de nuevo (uf)! ¿Hay una mejor alternativa a este flujo de trabajo?

[Particularmente no me importa si los cambios locales se mantienen a nivel local (alias, está bien si es la rama de la producción), sólo que no quiero que empujó a un repositorio remoto.]

+0

esto no funciona para mí. Agregué el archivo con --skip-worktree y el estado de git no se muestra. Sin embargo, todavía no puedo cambiar a otra sucursal. ¿Qué me estoy perdiendo? – sandyp

Respuesta

19

Usted puede tratar (git update-index man page):

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

Skip-worktree poco se puede definir en una frase (largo): Cuando se lee una entrada, si se marca como saltar-worktree, a continuación, Git finge su versión directorio de trabajo es de hasta hasta la fecha y lea la versión del índice en su lugar.

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

Ambas opciones tienen problemas. --assume-unchanged se restablece 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 vale para --skip-worktree.

+0

¡Gracias, eso funcionó! Tendré en cuenta esa advertencia. – Jeff

+4

Después de haber intentado tanto '--assume-unchanged' como' --skip-worktree', ambos continúan quejándose de los cambios no confirmados en el archivo cuando intento cambiar las ramas locales después de establecer esta propiedad. – amoe

+4

@amoe y ese archivo ya estaba versionado ¿verdad? ¿Qué sucede si agrega ese archivo a 'your_repo \ .git \ info \ exclude'? – VonC

2

Lo que he comenzado a hacer es crear un master de rama llamado privado que tenga 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.

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

+0

El enlace en su comentario no funciona, pero me gusta la idea que se describe en su respuesta. – Flimm

+0

Gracias por los comentarios, puse el enlace del blog corregido en la respuesta original –

1

La solución que funcionó para mí era utilizar --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 se realizan cambios en el local de archivo de sólo antes de ejecutar --skip-worktree, que es lo que me pasó.

Uno sugirió solución, más arriba, es agregar el archivo a your_repo/.git/info/exclude.Pero yo no quería añadir el archivo a la lista de exclusión, así que hice lo siguiente desde dentro de mi árbol de directorios de trabajo:

  1. cp <local-only_file> ~/
    • archivo de copia que tiene su local sólo cambios a alguna parte segura en el sistema de archivos
  2. git checkout <local-only_file>
    • en árbol de trabajo, pago y envío de archivos para que coincida con el archivo rama principal
  3. git update-index --skip-worktree -- <local-only_file>
  4. cp ~/<local-only_file> .
    • archivo de copia de que se trate de un lugar a salvo de nuevo en árbol de trabajo
  5. git diff
    • no hay cambios deben mostrarse; si se presiona al repositorio principal, no hay cambios en <local-only_file> están incluidas en el empuje
0

este problema ocurre cuando el archivo omitido no es igual que el de la rama en la que está tratando a la comprobación o el estás tratando de tirar.

Cuestiones relacionadas