Supongamos que estoy colaborando con alguien a través de un repositorio de git, y hay un archivo en particular en el que nunca quiero aceptar ningún cambio externo.
¿Hay alguna forma de configurar mi repositorio local para no quejarme de una combinación conflictiva cada vez que git pull? Me gustaría seleccionar siempre mi versión local al fusionar este archivo.

echo 'path/to/file merge=ours' >> .gitattributes && git config --global merge.ours.driver true--globaletiqueta. Si solo desea este comportamiento para un solo repositorio,--globalecho 'path/to/file merge=ours' >> .gitattributes && git config merge.ours.driver trueRespuestas:
En la instancia específica de un archivo de configuración, estaría de acuerdo con la respuesta de Ron :
una configuración debe ser "privada" para su espacio de trabajo (por lo tanto, "ignorada", como en "declarada en un
.gitignorearchivo").Puede tener una plantilla de archivo de configuración con valores tokenizados y una secuencia de comandos que transforma ese
config.templatearchivo en un archivo de configuración privado (e ignorado).Sin embargo, esa observación específica no responde a lo que es una pregunta más general y más amplia, es decir, su pregunta (!):
Este tipo de fusión es una "fusión de copia", en la que siempre copiará la versión "nuestra" o "suya" de un archivo siempre que haya un conflicto.
Para "un archivo" (un archivo en general, sin hablar de un archivo de "configuración", ya que es un mal ejemplo), lo lograría con un script personalizado llamado mediante fusiones.
Git llamará a ese script porque habrá definido un valor de gitattributes , que define un controlador de combinación personalizado .
El "controlador de combinación personalizado" es, en este caso, un script muy simple que básicamente mantendrá sin cambios la versión actual, por lo que le permitirá seleccionar siempre su versión local.
. Es decir, como señaló por Ciro Santilli :
Probemos eso en un escenario simple, con un msysgit 1.6.3 en Windows, en una mera sesión de DOS:
Ahora, creemos dos archivos, que tendrán conflictos, pero que se fusionarán de manera diferente.
Introduciremos un "conflicto" en el contenido de ambos archivos en dos ramas de git diferentes:
Ahora, intentemos fusionar "hisBranch" en "myBranch", con:
dirWithCopyMerge\b.txtdonde siempre quiero mantener mi versión deb.txt.Dado que la fusión se produce en "
MyBranch", volveremos a utilizarla y agregaremos lasgitattributesdirectivas " " que personalizarán el comportamiento de fusión.Tenemos un
.gitattributesarchivo definido en eldirWithCopyMergedirectorio (definido solo en la rama donde ocurrirá la fusión :)myBranch, y tenemos un.git\configarchivo que ahora contiene un controlador de fusión.Si aún no define keepMine.sh y ejecuta la combinación de todos modos, esto es lo que obtiene.
Eso está bien:
a.txtestá listo para fusionarse y tiene un conflictob.txtaún está intacto, ya que se supone que el controlador de combinación se encarga de ello (debido a la directiva en el.gitattributesarchivo en su directorio).Defina un
keepMine.shen cualquier lugar de su%PATH%(o$PATHpara nuestro amigo de Unix. Yo hago ambas cosas, por supuesto: tengo una sesión de Ubuntu en una sesión de VirtualBox)Como se ha comentado por lrkwz , y se describe en el " Combinar estrategias sección" de Personalización de Git - Git atributos , puede reemplazar el script de shell con el comando shell
true.Pero en el caso general, puede definir un archivo de script:
keepMine.sh
(que era un conductor de combinación sencilla;) (Incluso más sencillo en ese caso, el uso
true)(Si quería mantener la otra versión, sólo tiene que añadir antes de la
exit 0línea:cp -f $3 $2.Eso es todo Combinar conductor tendría tiendas de comida para mantener la versión procedente del otro. rama, anulando cualquier cambio local)
Ahora, volvamos a intentar la fusión desde el principio:
La fusión falla ... solo para un.txt .
Edite un.txt y deje la línea de 'hisBranch', luego:
Comprobemos que b.txt se ha conservado durante esta fusión
La última confirmación representa la fusión completa :
(La línea que comienza con Merge prueba eso)
Considere que puede definir, combinar y / o sobrescribir el controlador de combinación, ya que Git lo hará:
<dir>/.gitattributes(que está en el mismo directorio que la ruta en cuestión): prevalecerá sobre el otro.gitattributesen directorios.gitattributes(que está en el directorio principal), solo establecerá directivas si aún no lo ha hecho$GIT_DIR/info/attributes. Este archivo se utiliza para anular la configuración del árbol. Sobrescribirá las<dir>/.gitattributesdirectivas.Por "combinar", me refiero a un controlador de combinación múltiple "agregado".
Nick Green intenta, en los comentarios , combinar los controladores de combinación: consulte " Combinar pom a través del controlador git de python ".
Sin embargo, como mencionó en su otra pregunta , solo funciona en caso de conflictos (modificación concurrente en ambas ramas).
fuente
cp -f $3 $2probablemente debe ser citado, es decircp -f "$3" "$2".PATH(Unix o WindowsPATH). Dado que ese script se interpretará a través del shell bash de Unix, o mediante el shell de Windows MsysGit bash MingWin, será portátil.Como ha comentado @ ciro-santilli, la forma sencilla de hacerlo es utilizarlo
.gitattributescon la configuración:y habilite esta estrategia con:
(Estoy agregando esto como una respuesta para hacerlo más visible, pero lo convertiré en un Wiki de la comunidad para no tratar de obtener créditos de usuario por encima de mí. ¡Por favor, vote a favor de su comentario debajo de la Q aquí para felicitarlo!)
fuente
:-)).Tenemos varios archivos de configuración que nunca queremos que se sobrescriban. Sin embargo .gitignore y .gitattributes no funcionaron en nuestra situación. Nuestra solución fue almacenar los archivos de configuración en una rama de configuración. Luego, permita que los archivos se cambien durante la fusión de git, pero inmediatamente después de la fusión use la "rama de verificación de git -". para copiar nuestros archivos de configuración de la rama de configuración después de cada combinación. Respuesta detallada de stackoverflow aquí
fuente