2011-01-18 25 views
46

Empecé a usar Maven con un proyecto de aplicación web para que la jerarquía de directorios cambiara. Creé una nueva rama para la integración de Maven. Ahora tengo dos ramas, una con la jerarquía de directorios anterior y otra con la jerarquía de directorios maven. Ambas ramas tienen nuevas confirmaciones (correcciones de errores y nuevas características).¿Cómo fusionar dos ramas con diferentes jerarquías de directorios en git?

Me gustaría deshacerme de la antigua rama y fusionar sus cambios con la rama Maven. La fusión de Git genera innumerables conflictos que parecen imposibles de resolver. Creo que esto se debe a que las rutas de archivos han cambiado.

¿Cuál es la mejor manera de abordar esta fusión?

+9

Solo para que otros lectores sepan: el mensaje de error típico para estos problemas es 'demasiados archivos omitiendo la detección de renombre inexacta'. –

Respuesta

115

Intente configurar merge.renameLimit a algo alto para esta combinación. git trata de detectar los cambios de nombre, pero sólo si el número de archivos está por debajo de este límite, ya que requiere O (n^2) Tiempo de procesamiento:

git config merge.renameLimit 999999 

entonces cuando se hace:

git config --unset merge.renameLimit 
+4

Nota: después de aumentar renameLimit, tuve que ejecutar "git merge --abort" para poder volver a intentar la extracción. De lo contrario, esto hizo el truco. – leontx

17

El blog post "Confluence, git, rename, merge oh my…" añade algo de información interesante que ilustra Robie 's answer (upvoted):

al tratar de detectar renombra git distingue entre exactas y inexactas cambios de nombre con:

  • siendo el primero un cambio de nombre sin cambiar el contenido del archivo y
  • este último un cambio de nombre que podría incluir cambios en el contenido del archivo (por ejemplo, cambiar el nombre/mover una clase de Java).

Esta distinción es importante porque el algoritmo para la detección de cambios de nombre exacto es lineal y siempre se ejecutará mientras que el algoritmo para la detección de cambio de nombre inexacto es cuadrática (O(n^2)) y GIT no trata de hacer esto si el número de archivos ha cambiado excede un cierto umbral (1000 por defecto).

Cuando no se establece explícitamente, merge.renameLimit tiene por defecto 1000 archivos o usa el valor de diff.renameLimit si se establece.
El diff.renameLimit afecta git diff, git show y git log mientras merge.renameLimit se aplica a fusionar intentos (git merge, git cherry-pick) solamente.

Es una buena idea cambiar el merge.renameLimit en lugar de cambiar el diff.renameLimit para que git no intente encontrar renombrados durante operaciones comunes como mirar el git diff de salida.

Para mostrar el cambio de nombre, los comandos como git show o git log se pueden usar con la opción -M que activa la detección de cambio de nombre.

Linus mentions:

Sí, para el núcleo, que tienen

[diff] 
      renamelimit=0 

para desactivar el límite del todo, ya que el límite predeterminado es realmente muy bajo. Git es bastante bueno en la detección de cambio de nombre.

Sin embargo, la razón del bajo valor predeterminado no es porque no sea lo suficientemente ágil, es porque puede terminar usando mucha memoria (y si tiene poca memoria, el intercambio significará que va desde " bastante ágil para "ralentizar como melaza", pero aún así no será limitado por la CPU, es solo una paginación como loca).

Cuestiones relacionadas