2010-12-23 13 views
20

Tengo un repositorio con dos ramas: en vivo y en el escenario. El repositorio contiene el código para una aplicación basada en web. Me gustaría mantener dos archivos .htaccess diferentes para las ramas de escenario y directo, pero aún así mantener su versión controlada, ya que la naturaleza de servir un sitio de escenario es un poco diferente (en este momento, por ejemplo, quiero que las memorias caché se sincronicen) diferentemente).git workflow: ¿Puedo evitar que cierto archivo se fusione con otra rama pero aún así mantenerlo bajo control de versión?

Soy un principiante con git así que probablemente haya una explicación fácil, pero me gustaría tener un flujo de trabajo donde cuando estuve en vivo y realicé cambios (simple git merge stage), no sobrescribí el existente .htaccess en la rama en vivo. ¿Hay alguna forma de configurar esto? ¿Me estoy perdiendo algún gran concepto en git?

Del mismo modo, también hay una porción de un (pero posiblemente muchos) archivos .html en los que me gustaría realizar un seguimiento de los cambios pero no fusionarlos nuevamente en vivo. Para que quede claro, quiero que en vivo y en el escenario haga un seguimiento de los cambios en estos archivos, pero sepa no fusionar esos ciertos cambios cuando realice fusiones.

Respuesta

29

encontré un answer on another question desbordamiento de pila, el crédito va a fcurella:

digamos que desea enviar por correo xclude el archivo config.php

En la rama A:

  1. Crear un archivo llamado .gitattributes en el mismo directorio, con esta línea: config.php merge=ours. Esto le dice a git qué estrategia usar al fusionar el archivo. En este caso, siempre mantendrá su versión, es decir. la versión en la rama en la que se está fusionando.

  2. añadir el archivo .gitattributes y comprometerse

En la rama B: repita los pasos 1-2

Pruebe ahora la fusión. Su archivo no debe tocarse.

Parece una solución más escalable.

+14

Funciona solo en caso de que exista un conflicto en config.php al fusionar, de lo contrario no funciona y sobrescribe el archivo. – dirtyhandsphp

+0

sí, pero esto es lo más importante: en mi caso, quiero sincronizar un tenedor desde el repositorio principal sin que mis archivos css se modifiquen. –

5

Ankur, intente esto:

Suponiendo que están registrados a cabo en la rama viva, ejecute:

git merge --no-commit --no-ff stage 

Esto fusionar las dos ramas, pero en vez de hacer un nuevo compromiso, se producirá un error y deje estos cambios en su archivo de índice y directorio de trabajo. Ahora bien, puesto que desea mantener su archivo .htaccess intacta en la rama viva, puede obtenerlos este archivo desde live:

git checkout live .htaccess 

ahora su árbol de trabajo cuenta con todos los cambios de fase con la excepción de .htaccess, y para que pueda ultimar la fusión comprometo:

git commit -m "Pulled changes from stage" -a 
+0

esa es la idea general, pero esto no escala bien si tengo 5-10 archivos más que finalmente tienen diferencias. Tendría que rastrearlos por mi cuenta. – Ankur

+0

Si tiene muchos más archivos que le gustaría conservar en estas fusiones, entonces quizás pueda ponerlos en sus propias sucursales vacías (una para el sitio en vivo, otra para el sitio de la etapa). De esta forma, puede proceder de forma normal al hacer confusiones de fusión entre las ramas de etapa y en vivo, pero aún tener ramas separadas para rastrear los cambios en .htaccess y el resto de sus archivos html estáticos. –

Cuestiones relacionadas