Git – Ignorar archivos durante la fusión

8 minutos de lectura

Git Ignorar archivos durante la fusion
kevin rave

tengo un repositorio llamado myrepo en el control remoto beanstalk servidor.

Lo cloné en mi máquina local. Creó dos sucursales adicionales: staging y dev. Empujó estas ramas a control remoto también.

Ahora:

 local                   remote                   server
 --------------------------------------------------------  
 master  ==> Pushes to  `master`  ==> deployed to `prod`
 staging ==> Pushes to  `staging` ==> deployed to `staging`
 dev     ==> Pushes to  `dev`     ==> deployed to `dev`

tengo un archivo llamado config.xml que es diferente en cada rama.

Quiero ignorar este archivo solo durante las fusiones. Pero quiero que esto se incluya cuando pago o me comprometo desde/hacia la rama de repositorio.

La razón por la que quiero esto es que tenemos un script de implementación que extrae (paga) la rama específica y se implementa en los servidores respectivos. Así que necesitamos config.xml El archivo de esa rama específica va al servidor específico como se indicó anteriormente cuando se implementa.

supongo .gitignore no funcionará ¿Cuáles son las otras opciones? Tenga en cuenta que el archivo ignorado debe ser parte del pago y confirmación, lo cual es importante. debe ignorarse solo durante las fusiones.

¡Gracias!

  • En su modo predeterminado, git pull es una abreviatura de git fetch seguido de git merge FETCH_HEAD. Así que sus declaraciones entran en conflicto entre sí.

    – zzk

    5 de marzo de 2013 a las 19:07

  • Bueno, yo diría, su pago. No tirar. Actualizaré la pregunta para que quede claro.

    –Kevin Rave

    5 de marzo de 2013 a las 19:08

  • posible duplicado de Git: ignore algunos archivos durante una fusión (mantenga algunos archivos restringidos a una rama)

    – givanse

    12 de febrero de 2014 a las 21:24

  • ¿alguna vez encontraste una solución a esto? Los atributos de git solo son útiles en el caso de que el archivo tenga conflictos entre las ramas que se fusionan, por lo que no siempre es suficiente.

    – pvinis

    23 de agosto de 2016 a las 6:00

  • ¿Buscaste enlaces simbólicos (no seguidos de git) o ​​incluso enlaces duros para el rescate?

    – Frank Noke

    1 de noviembre de 2017 a las 8:10

1646749929 49 Git Ignorar archivos durante la fusion
unmesh-gurjar

Superé este problema usando el comando git merge con el --no-commit y luego eliminó explícitamente el archivo provisional e ignoró los cambios en el archivo. Por ejemplo: digamos que quiero ignorar cualquier cambio en myfile.txt Procedo de la siguiente manera:

git merge --no-ff --no-commit <merge-branch>
git reset HEAD myfile.txt
git checkout -- myfile.txt
git commit -m "merged <merge-branch>"

Puede poner las declaraciones 2 y 3 en un bucle for, si tiene una lista de archivos para omitir.

  • Agregaría “–no-ff” si desea que un archivo no se sobrescriba cuando se fusiona en la estrategia de avance rápido.

    – Ilia Shakitko

    18/04/2017 a las 20:21

  • entonces que hace git reset HEAD myfile.txt hacer exactamente? ¿Cómo ayuda con nuestro objetivo aquí?

    – Kid_Learning_C

    22 de julio de 2019 a las 20:13

  • ¿Cómo pones las líneas 2 y 3 en un bucle?

    – Juan

    21 de enero de 2020 a las 18:07

  • @AndroidDev Puedes hacer algo como esto: for i in `ls myfile.txt myfile_2.txt`; do echo $i; git reset HEAD $i && git checkout -- $i; done

    – Wawrzyniec Pruski

    15 oct 2020 a las 15:01


  • @Kid_Learning_C: git reset HEAD myfile.txt desmonta el archivo (que fue puesto en escena --no-commit fusión)

    – Partha Mandal

    19 oct 2020 a las 19:00

Git Ignorar archivos durante la fusion
kevin rave

Terminé encontrando git attributes. probándolo Trabajando hasta ahora. Todavía no comprobó todos los escenarios. Pero debe ser la solución.

Fusionar estrategias: atributos de Git

  • pero encontre esto git-scm.com/book/ch7-2.html#Merge-Strategies

    – Nate-

    16 de agosto de 2013 a las 17:28


  • Aquí está el enlace correcto para la sección de estrategias de combinación de los documentos de atributos de git: git-scm.com/book/en/v2/…

    – Adrián Laurenzi

    12 de enero de 2018 a las 19:27

  • Encontré esto bien explicado en un artículo. medium.com/@porteneuve/…

    – Shawn emplumado

    01/03/2018 a las 20:00


  • Esto parece ser un problema si no hay conflictos? ¿Se seguirán fusionando los archivos?

    – Brett

    21 de julio de 2018 a las 10:10

  • @Brett, de hecho, puede mantener este archivo siempre en conflicto en cada rama, por lo que puede evitar la fusión automática porque no hay conflicto. Por ejemplo, agregue una línea al archivo de cada rama: <text>{branch_name}</text>

    – libertar

    19 de enero a las 2:56


Git Ignorar archivos durante la fusion
eigenharsha

.gitattributes – es un archivo de nivel raíz de su repositorio que define los atributos de un subdirectorio o subconjunto de archivos.

Puede especificar el atributo para decirle a Git que use diferentes estrategias de combinación para un archivo específico. Aquí, queremos preservar lo existente. config.xml para nuestra sucursal. Necesitamos establecer el merge=foo para config.xml en .gitattributes expediente.

merge=foo dígale a git que use nuestro archivo (rama actual), si ocurre un conflicto de fusión.

  1. Agrega un .gitattributes archivo en el nivel raíz del repositorio

  2. Puede configurar un atributo para confix.xml en el .gitattributes expediente

     <pattern> merge=foo
    

    Tomemos un ejemplo para config.xml

     config.xml merge=foo
    
  3. Y luego definir un dummy foo fusionar estrategia con:

     $ git config --global merge.foo.driver true
    

Si fusionas el stag formulario dev rama, en lugar de que la combinación entre en conflicto con la config.xml archivo, el archivo config.xml de la rama de ciervo se conserva en la versión que tenía originalmente.

para más referencia: fusionar_estrategias

  • Pero, ¿y si no hay conflicto? ¿Cómo mantener siempre un determinado archivo durante la fusión?

    – Ígor Yalovoy

    16 de abril de 2018 a las 13:53

  • @IgorYalovoy: Si no hay conflicto… bueno, esto es un poco complicado ya que en realidad funciona a partir de identificadores hash, pero: si config.xml es completamente sin cambios desde la base de combinación a cualquiera de las versiones de punta de rama, Git solo toma la versión modificada, sin mirar el merge.ours.driver ajuste. Así que tienes razón en preocuparte.

    – torek

    26 de junio de 2018 a las 12:11

  • copiar y pegar de Git Docs: Merge Strategies – Atributos de Git. Enlace

    – kyb

    7 sep 2018 a las 19:02

  • “nuestro” parece ser un nombre arbitrario para la nueva estrategia que se está introduciendo. Encontré esto confuso, porque theirs es una estrategia de combinación integrada. Pero parece que uno puede escribir <pattern> merge=fooluego git config --global merge.foo.driver truey funcionará de la misma manera.

    – Kyle Strand

    14 oct 2019 a las 18:22

  • Agregar un .gitattributes archivo a la main rama con <filename-to-exclude> merge=oursluego corriendo git config --global merge.ours.driver true funcionó muy bien El archivo de configuración en dev no se fusionó en el archivo de configuración en main. Desafortunadamente, durante la fusión el .gitattributes archivo fue eliminado (porque no existía en dev)! ¿Cómo evitar esto? Solo agrega lo mismo .gitattributes archivo a dev? ¿El ours valor causa un conflicto?

    – ericOnline

    6 mayo 2021 a las 19:02

Podrías empezar usando git merge --no-commity luego edite la combinación como desee, es decir, anulando config.xml o cualquier otro archivo, luego confirme. Sospecho que querrías automatizarlo aún más después de eso usando ganchos, pero creo que valdría la pena hacerlo manualmente al menos una vez.

¿Como convertir un archivo a utf 8 en Python
único sensei

Ejemplo:

  1. Tienes dos sucursales: master, develop
  2. Usted creó el archivo en develop rama y quiero ignorarlo mientras se fusiona

Código:

git config --global merge.ours.driver true
git checkout master
echo "path/file_to_ignore merge=ours" >> .gitattributes
git merge develop

También puede ignorar archivos con la misma extensión

por ejemplo todos los archivos con .txt extensión:

echo "*.txt merge=ours" >> .gitattributes

  • ¡Esto funciona solo en situaciones en las que hay un conflicto!

    – Жасулан Бердибеков

    5 de octubre de 2020 a las 3:59

1646749931 4 Git Ignorar archivos durante la fusion
caballero

podrías usar .gitignore para mantener la config.xml fuera del repositorio, y luego use un gancho posterior a la confirmación para subir el apropiado config.xml archivo al servidor.

  • ¡Esto funciona solo en situaciones en las que hay un conflicto!

    – Жасулан Бердибеков

    5 de octubre de 2020 a las 3:59

Como comentaron muchos, se debe tener en cuenta que la respuesta aceptada y las copias de la misma (usando una estrategia de combinación personalizada para un archivo o archivos específicos) solo funciona en los casos en que habría conflictos de fusión reales.

2 casos simples que no darían lugar a conflictos de fusión y, por lo tanto, se comprometen a fusionarse:

  • Usted tiene un config.xml archivo en una rama de función y no en maestro. Desea excluirlo durante la fusión
  • Tu config.xml archivo en ambas ramas se basan en la misma confirmación. El nuevo código se agrega al archivo en función.

Cualquiera de los usos merge --no-commit como lo demuestra unmesh-gurjar o simplemente seleccionar compromisos individuales en el maestro. Este último, por supuesto, es bastante engorroso y viene con un par de otras trampas (nuevas ID SHA1, etc.)

  • ¿Cuál es la resolución de esto?

    – gabriel

    20 jun 2021 a las 13:00


  • @Gabriel: La triste verdad es que no existe una solución de configuración y olvido tan simple como agregar un archivo a .gitignore afaia. Necesitaría usar una de las soluciones anteriores (que son en mi humilde opinión) o, lamentablemente, trabajar con otros VCS.

    – MattSchmatt

    1 de noviembre de 2021 a las 13:07


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad