2010-10-05 10 views
46

Tengo dos ramas, A y B. La rama A tiene un directorio examples con algunos archivos que son rastreados por git, y estos archivos deben no aparecer en la rama B. En mi flujo de trabajo, fusiono los cambios realizados en A en B a menudo, lo cual es un problema cada vez que hay algunos cambios en examples. Por el momento estoy haciendo esto manualmente: borrando los archivos después de la fusión o resolviendo conflictos cuando había un cambio en un archivo que ya había borrado.Git: ignorar algunos archivos durante una combinación (mantener algunos archivos restringidos a una rama)

¿Es posible ignorar estos archivos durante una combinación? (¿O es posible mantener algunos archivos restringidos a una rama (A) o fuera de una rama (B)?)


Vamos a tratar de explicar por qué estoy haciendo esto: A es un esqueleto de un blog (plantilla, scripts, etc.), B es mi blog (A lleno de mis propios mensajes, imágenes, borradores, etc.). A es público y estoy tratando de hacerlo genérico para que otros lo vean y lo utilicen, pero debido a esto necesito algunas publicaciones como escaparate/pruebas (el directorio examples). Cada cambio en A y luego se fusiona en B para tener estos cambios en mi instancia de blog - de esta manera aparecen todos los ejemplos nuevos en B y todos los ejemplos eliminados en B que se han cambiado en A desde la última combinación resulta en un conflicto.

+0

Parece que hay algo mal en su flujo de trabajo. ¿Has pensado en usar submódulos git en su lugar? – mb14

+0

He editado mi pregunta explicando por qué estoy haciendo esto. No tengo experiencia con submódulos. ¿Es adecuado para esto? – dbarbosa

+0

En realidad, @Lestat, etc. Esto definitivamente no es un duplicado de # 928646, porque esa pregunta se refiere a "fusiones en conflicto", mientras que aquí se entiende "todas las fusiones". En este caso, no se invocan controladores de fusión, y eso corta la forma recomendada de manejar las diferencias de archivos cuando hay conflictos: es decir, usar controladores de combinación. ¿Podría esta pregunta no duplicarse? –

Respuesta

3

Puede resultarle útil el comando rerere de git. Con eso puedes registrar resoluciones para ciertos conflictos de combinación y reutilizarlos más tarde.

+2

He tratado de seguir esto: http://progit.org/2010/03/08/rerere.html Pero no está funcionando ... Después del conflicto, 'git rerere status' y' git rerere diff' doesn no mostrar nada Ya lo he comprobado y está en mi ~/.gitconfig, he creado el directorio .git/rr-cache en mi repositorio ... De todos modos, puedo ver que esto funcionará para el caso de cambio de archivos en 'examples' en' A'. ¿Esto también puede funcionar para nuevos archivos? (Si se crea un nuevo archivo en 'examples', la fusión de este archivo no entrará en conflicto; el archivo se agregará a' B'). – dbarbosa

1

Con sus actualizaciones: Sí, los submódulos serían apropiados para este uso si todo A se ajusta en un subdirectorio de B (o viceversa). Un ejemplo de submódulos con WordPress sería si tienes un repositorio git de Wordpress; podría agregar un submódulo para un tema que estaría dentro del directorio /wp-content/themes/.

El documentation for submodules podría ayudar.

Si los archivos de los dos están entrelazados, podría ser más difícil. La mayoría de los casos en que los submódulos se pueden utilizar de esta manera, la aplicación en cuestión se diseñó para permitirlos.

49

He encontrado una buena respuesta aquí: stackoverflow Q332528

Utiliza las ideas tomadas de aquí: Pro-Git merge strategies

Aquí está una copia de la misma:

Digamos que desea excluir el archivo config.php

En la rama A:

  1. Cree 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 combinar 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. Agregue el.gitattributes archivo y comprometerse

En la rama B: Repita los pasos 1-2

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


Editar:
Desde el git book En cuanto merge=ours, "Una opción muy útil es decirle a Git que no trate de combinar archivos específicos cuando tienen conflictos, pero en lugar de usar su lado de la fusionarse con el de otra persona ".

Por lo tanto, esta respuesta no se aplica tan bien como podría a la pregunta. pjmorse's answer con respecto al uso de submódulos es bueno.

Otra opción sería usar a sub-tree merge, que puede tener beneficios adicionales.

+3

Esto no funcionó para mí, ya sea que puse la línea myfile merge = ours en .gitattributes o .git/info/attributes. Según tengo entendido, no hay conflicto de fusión entre un archivo nuevo y ningún archivo, por lo que no hay un problema de estrategia: cuando me fusiono, el archivo que deseo excluir aparece como "nuevo archivo: miarchivo" en "Cambios que se comprometerán". – skierpage

+1

Correcto, esto solo funciona si ya tiene su propia versión del archivo (s) confirmado (s). He editado y agregado información. – David

+3

Hay un [artículo] actualizado (https://git-scm.com/book/uz/v2/Customizing-Git-Git-Attributes) que indica que también tendrá que declarar la estrategia de fusión a través de '$ git config - -global merge.ours.driver true' – dag

Cuestiones relacionadas