Git: fusionar sucursales públicas y privadas mientras se mantienen ciertos archivos intactos en ambas sucursales

StackOverflow https://stackoverflow.com/questions/1807036

  •  05-07-2019
  •  | 
  •  

Pregunta

He leído algunas preguntas de git aquí, pero no pude encontrar una respuesta a esta:

Tengo sucursales públicas y privadas donde quiero permitir que ciertos archivos divergan.

Esos son archivos de configuración con contraseñas y mis personalizaciones locales.

Quiero poder combinar las sucursales en ambos sentidos: de privado a público y viceversa, pero no quiero que esos archivos específicos se fusionen automáticamente.

¿Hay una manera de configurar git de esta manera? Me encantaría encontrar una solución automatizada :) - para que la fusión se pueda hacer como de costumbre.


EDITAR: aquí está la solución que me funcionó (gracias a VonC por el asesoramiento sobre gitattribute)

lo único inesperado para mí fue que " protección de fusión " comienza a funcionar solo después de que los archivos se hayan desviado en las dos ramas, no inmediatamente después de que se haya aplicado la siguiente configuración

.gitattributes (realiza un seguimiento con git si quieres compartir esto) o .git / info / attributes:

file1      merge=keepmine
path/file2     merge=keepmine

keepmine es el administrador de combinación personalizado con nombre que es solo un comando llamado "no hacer nada" en lugar del controlador de combinación interno en los archivos seleccionados, que se configura a continuación

Cuando me fusiono de una sucursal privada a una pública, normalmente hago git merge --squash private . De ese modo, las ediciones privadas no entrarán en el historial de git en la sucursal pública.

.git / config:

#public repository
[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = <public repo git url> 

#private repository
#has to set up with git init and populated with the initial commit to branch mybranch
[remote "private"]
    push = +:
    url = /path/to/local/private/repo 
[merge "keepmine"]
    name = dont_merge_selected_files
    driver = echo %O %A %B 
[branch "master"]
    remote = origin
    merge = refs/heads/master 

#private branch settings
[branch "mybranch"]
    remote = private
    merge = refs/heads/mybranch

Si hay una manera de mejorar esto, por favor comenta

¿Fue útil?

Solución

Para estar seguro, puede agregar un atributo git (vea aquí para un ejemplo ) para esos archivos privados.

De esa manera, puede definir un script (un " administrador de mezcla ") que garantizará que el archivo, incluida la información privada, permanezca vacío (o con un contenido público) si se fusiona en la sucursal pública, manteniendo su contenido local si fusionado a la rama privada.
Significa que puede fusionar / reajustar sin pensar en ese archivo.

Otros consejos

Una forma de hacerlo es con git rebase . Al mantener sus cambios privados a unos pocos pasos del final de su master , puede enviar información pública a la rama master (o lo que sea que elija como su rama de trabajo) y luego vuelva a ajustar su sucursal privada contra el maestro cada vez que quiera actualizar.

Otra forma de manejar esto es mantener los archivos de configuración de la plantilla en Git, como frobozz.config.template . En su directorio de trabajo, copie frobozz.config.template a (sin versión) frobozz.config y modifique. Solo asegúrese de hacer una copia de seguridad de su directorio de trabajo, si necesita hacer una copia de seguridad de sus cambios locales.

Esto solo parece funcionar si se detectan conflictos de combinación. Al fusionarse entre las ramas, el archivo se sobrescribe. A menos que establezca algo mal. Por supuesto esto en Windows msysgit git versión 1.6.5.1.1367.

Mantener las contraseñas bajo el control de versiones es la peor idea. Necesita CVS, no git, para trabajar con archivos separados. Git como muchos otros DVCS modernos que trabajan con todo el árbol, no con archivos separados.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top