2012-04-19 14 views
10

Lo que quiero hacer ya se describe en that question. Pero quiero resolver ese problema de una manera práctica y más genérica. Por lo que el caso de uso es el siguiente:¿Qué es un flujo de trabajo práctico para mantener los cambios locales sin compromiso en git?

  • Tengo varios cambios locales en varios archivos web.config, createDb.sql o en cualquier otro
  • no quiero cometer esos archivos, ya que los cambios son específicos de mi local, máquina sólo
  • esos archivos debe ser versión controlada y cambios por otra parte se hacen bastante a menudo a algunos de ellos (secuencias de comandos SQL, en particular), así que quiero recibir actualizaciones para esos archivos
  • I hago quieren comprometerse todas otros archivos
  • yo quiero ser capaz de hacer eso sin fricción, en un comando (utilizando pijo-GIT, así que PowerShell es bienvenida)

El vinculada a la solución que asegura haber utilizado git add -p y que no es práctico, ¿es aburrido recoger trozos manualmente todo el tiempo o tal vez hay una forma más conveniente de hacerlo?

Por ejemplo, uno de los siguientes podría funcionar:

  • si hay una posibilidad de filtrar los archivos que se encuentran en mi copia de trabajo antes de añadirlos al índice, algo así como git -add -A -EXCEPT web.config crateDb.sql. Entonces puedo mapear un alias de git y eso es todo.
  • si existe la posibilidad de eliminar el alijo. Me refiero a eliminar los cambios que están contenidos en un alijo específico de la copia de trabajo. Así que tendré que hacer algo como git stash -deapply antes de cada confirmación, que también está bien.

El problema es muy común y es raro que no haya una solución actualmente. P.ej. TortoiseSVN tiene la función "ignorar en el compromiso", Perforce permite almacenar ese tipo de cambios locales en una lista de cambios separada y nunca enviarla ...

¿Alguna idea?

+0

¿De qué otro modo puede "controlar la versión" de esos archivos además de realizar los cambios? En git, comprometer _is_ local y _push_ afecta a otras computadoras/repositorios. Para mí, esto huele como una mejor solución es algo así como [esto] (http://stackoverflow.com/questions/6009/how-do-you-deal-with-configuration-files-in-source-control). –

+0

Tengo una mejor solución para archivos de configuración - [NConifig] (https://github.com/Yegoroff/NConfig), pero el problema es que no solo tengo archivos de configuración. – Restuta

Respuesta

10

usted podría intentar hacer lo siguiente antes de su git commit:

git update-index --assume-unchanged web.config crateDb.sql 

De ayuda git:

--assume-sin cambios

--no-assume- sin cambios

Cuando estos se especifican los indicadores, los nombres de los objetos registrados para las rutas no se actualizan. En cambio, estas opciones establecidas y desarman el bit "asumir sin cambios" para las rutas. Cuando el bit "asumir sin cambios" está activado, git deja de verificar los archivos de árbol de trabajo para posibles modificaciones, por lo que debe desarmar manualmente el bit para indicar git cuando cambie el archivo de árbol de trabajo.Esto a veces es útil cuando se trabaja con un proyecto grande en un sistema de archivos que tiene una llamada al sistema muy lenta lstat (2) (por ejemplo, cifs).

Esta opción puede también ser utilizado como un mecanismo a nivel de archivo grueso a ignorar los cambios no confirmados en los archivos de seguimiento (similar a lo que hace .gitignore para archivos sin seguimiento). Git fallará (con gracia) en caso de que necesite para modificar este archivo en el índice, p. cuando se fusiona en un compromiso; por lo tanto, en caso de que el archivo asumido no rastreado se cambie en sentido ascendente, necesitará para manejar la situación manualmente.

+0

¿Cómo se comportará git después de eso? ¿Seguirá rastreando esos archivos? ¿Si recibiré una actualización que sucederá? – Restuta

+0

+1 Esto resuelve el problema. – ralphtheninja

+1

@Restuta Los archivos seguirán siendo rastreados por git, pero git los considerará temporalmente como no modificados, incluso si han cambiado. Así que el estado de git, etc. no informará los archivos que se están cambiando. Utilice --no-assume-unchanged para deshacer el comando y deje que a git le importen los cambios nuevamente. – ralphtheninja

Cuestiones relacionadas