git - submodule - Fusionar cambios de subárbol-fatal: ruta no válida ''somefile_BASE_20704.cs''
git subtree push (1)
No sé qué causó esto. Sin embargo, así es como lo resolví, algo así. ¡Todavía quiero mejores respuestas!
Ambos ''compartidos'' SharedStuff
el maestro real en SharedStuff
y la copia separada de ProjectB
tenían los mismos compromisos en su historial lejano; bueno, los mismos cambios con SHA en el mismo tree
internamente, pero diferentes SHA para compromisos. Esto se debe a que, de alguna manera, la rama ProjectB
tuvo un primer compromiso inicial diferente al de SharedStuff
.
Mientras no haya confirmaciones comunes (con los mismos SHA) en la historia, la fusión, la reorganización, etc. no podrá encontrar un terreno común y supondrá que los archivos se agregaron en ambas historias.
La solución: encuentre dos confirmaciones tempranas en el historial con el mismo tree
SHA (es decir, exactamente el mismo contenido de archivo), e información de confirmación (mensaje, autor, etc.) y "sobrescriba" manualmente el padre de esa confirmación en la rama dividida de ProjectB
para El padre en el maestro de SharedStuff
.
Hice esto usando un injerto: Establecer el puntero padre git a un padre diferente
- Escriba una nueva línea para
.git/info/grafts
, básicamentewrong-parent right-parent
- Cambie a la rama: descubra que PowerShell
echo
utiliza un formato de caracteres de 16 bits, vuelva a guardar con Sublime Text y vuelva a cambiar;) - Ejecute
git filter-branch right-parent..HEAD
en la rama para sellar el trato - Verifica que todo sea fusionable.
El próximo desafío divertido será ver cómo esta versión se fusiona nuevamente con ProjectB
; se actualizará cuando haya terminado ..
Aún así, realmente agradecería una respuesta real a esto, ¡esto es realmente intrépido!
Tengo tres reposiciones - nombres cambiados por claridad:
SharedStuff
, ProjectA
y ProjectB
Ambos proyectos utilizan git-subárbol para mantener una copia local de SharedStuff
. Ambos han hecho cambios locales que estoy intentando fusionar centralmente, probar y luego volver a fusionar con cada uno.
He ejecutado esto en el repositorio de ProjectA:
git subtree split --prefix=SharedStuff -b SharedStuff_from_ProjectA --rejoin
... luego lo SharedStuff
repositorio de SharedStuff
, resolvió algunos conflictos simples y lo fusionó.
Ahora he ejecutado esto en el repositorio de ProjectB:
git subtree split --prefix=platform/SharedStuff -b SharedStuff_from_Project_B --rejoin
... y otra vez empujó eso al repo de SharedStuff
en una nueva rama. El problema ocurre cuando intento fusionar esos cambios en.
En el caso actual, cambio a la rama SharedStuff_from_Project_B
, luego git merge master
, pero de inmediato aparece todos los archivos modificados como conflictos de agregar / agregar . Cuando ejecuto git mergetool
, cada uno tiene un error como este:
Merging:
somefile.xyz
Normal merge conflict for ''somefile.xyz'':
{local}: created file
{remote}: created file
fatal: invalid path ''./somefile.xyz_BASE_20704.cs''
(Por supuesto, si intento lo contrario, para fusionar SharedStuff_from_Project_B
en master
, obtengo los mismos tipos de conflictos, solo se invierte. Todavía agregue / agregue).
Mi conjetura es que algo podría estar mal en la historia de ProjectB, causando la aparición de agregar / agregar. Sin embargo, no estoy seguro de cómo diagnosticar esto aún más. ¿Qué puedo hacer?
Edición : hubo un subárbol anterior "reincorporarse" a la confirmación en ProjectB
, pero los cambios no se fusionaron en SharedStuff
en ese momento, según parece. Sin embargo, volver a ejecutar git subtree split
con --ignore-joins
produce el mismo problema: muchos conflictos de combinación add/add
, a pesar de que el historial de esa rama de subárbol dividido se remonta a cuando SharedStuff
se colocó por primera vez en ProjectB
. :(
Edición : también git merge-base
entre el subárbol dividido de ProjectB
y master
en SharedStuff
no da ningún resultado. ¿No estoy seguro de cómo llegó a ser esto o cómo resolverlo?