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
--global
etiqueta. Si solo desea este comportamiento para un solo repositorio,--global
echo 'path/to/file merge=ours' >> .gitattributes && git config merge.ours.driver true
Respuestas:
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
.gitignore
archivo").Puede tener una plantilla de archivo de configuración con valores tokenizados y una secuencia de comandos que transforma ese
config.template
archivo 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.txt
donde siempre quiero mantener mi versión deb.txt
.Dado que la fusión se produce en "
MyBranch
", volveremos a utilizarla y agregaremos lasgitattributes
directivas " " que personalizarán el comportamiento de fusión.Tenemos un
.gitattributes
archivo definido en eldirWithCopyMerge
directorio (definido solo en la rama donde ocurrirá la fusión :)myBranch
, y tenemos un.git\config
archivo 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.txt
está listo para fusionarse y tiene un conflictob.txt
aún está intacto, ya que se supone que el controlador de combinación se encarga de ello (debido a la directiva en el.gitattributes
archivo en su directorio).Defina un
keepMine.sh
en cualquier lugar de su%PATH%
(o$PATH
para 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 0
lí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.gitattributes
en 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>/.gitattributes
directivas.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 $2
probablemente 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
.gitattributes
con 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