2010-04-20 15 views
15

Estoy trabajando con un repositorio git que almacena datos para un sitio web. Contiene un archivo .htaccess, con algunos valores que son adecuados para el servidor de producción. Para que pueda trabajar en el sitio, tengo que cambiar algunos valores en el archivo, pero nunca quiero comprometer estos cambios o romperé el servidor.¿Cómo le dices a git que ignore permanentemente los cambios en un archivo?

Dado que .gitignore no funciona para archivos rastreados, estaba usando "git update-index --assume-unchanged .htaccess" para ignorar mis cambios en el archivo, sin embargo, esto solo funciona hasta que cambie de ramas. Una vez que vuelva a cambiar a su rama original, sus cambios se perderán.

¿Hay alguna manera de decirle a git que ignore los cambios en un archivo y? Déjelo en blanco cuando cambie de ramas? (Del mismo modo que si el archivo fue sin seguimiento.)

Respuesta

9

Se puede usar un smudge/clean process (un gitattribute filter driver, descrito in ProGit)

clean smudge

Cada vez que actualice su directorio de trabajo, que tendría la oportunidad de sustituir el contenido de su .htaccess con uno predefinido, correcto para su entorno actual.
En la etapa de limpieza, restauraría el contenido original, como si nunca hubiera tocado ese archivo.

+1

perfecto! Esto resolvió mi problema. Agregué ".htaccess filter = htaccess" en .git/info/attributes, luego en .git/config agregué: [filter "htaccess"] clean = sed's/mypath |/dev ' smudge = 's |/dev |/mypath' de sed y ahora cualquier referencia a/dev/algo en el archivo .htaccess se reemplaza silenciosamente por/mypath/algo, y se restaura al final, lo que significa que incluso puedo editar el archivo y confirmar mis cambios, sin obtener la versión/mypath en el repositorio! – Malvineous

2

enfoque basado en git: utilice una rama de producción y mantenga allí los cambios específicos de su entorno de producción. Para lanzar a producción, combine su rama principal en su rama de producción.

enfoque basado en la implementación: utilice una herramienta (como capistrano/cfengine/...) para automatizar su proceso de implementación. Esto tiene muchas ventajas, una de ellas es la capacidad de mantener la configuración separada de su código.

+0

Actualmente uso el enfoque basado en git (con una rama de producción) pero cada desarrollador tiene un archivo .htaccess separado para su entorno de desarrollo. Incluso con una rama de producción separada, todavía tenemos que evitar manualmente el compromiso de nuestros archivos .htaccess personalizados en la rama principal. De acuerdo, esto no romperá el servidor, pero desordena el repositorio cuando sucede. – Malvineous

7

Basta con decir git para asumir el archivo es el mismo:

$ git update-index --assume-unchanged FILE [FILE ...] 

Del manual:

--assume-unchanged, --no-assume-unchanged 
     When these flags are specified, the object names recorded for the paths are not updated. Instead, these options set and unset the "assume unchanged" bit for the paths. When the "assume unchanged" bit is on, git stops checking the 
     working tree files for possible modifications, so you need to manually unset the bit to tell git when you change the working tree file. This is sometimes helpful when working with a big project on a filesystem that has very slow 
     lstat(2) system call (e.g. cifs). 

     This option can be also used as a coarse file-level mechanism to ignore uncommitted changes in tracked files (akin to what .gitignore does for untracked files). Git will fail (gracefully) in case it needs to modify this file in the 
     index e.g. when merging in a commit; thus, in case the assumed-untracked file is changed upstream, you will need to handle the situation manually. 

encontrados en How to Ignore Changes in Tracked Files With Git

+0

Para su información, esto se mencionó en la pregunta como no funciona ... ¿ha cambiado algo desde entonces para que funcione ahora? – Malvineous

+0

@Malvineous, leí mal esa parte de la pregunta, pero al parecer, funciona ahora: https://gist.github.com/4564516 –

+0

Para quien se lo pregunte, para seguir el archivo de nuevo, use '--no-assume-unchanged' . – SUPERCILEX

Cuestiones relacionadas