Cómo fusionar el repository de git con los cambios de los diferentes upstream

Hace años, creé un repository público de un proyecto de SourceForge en Github. En aquel entonces, el proyecto solo era compatible con CVS, así que utilicé git cvs para sincronizar periódicamente mi repository con el original.

No ha habido ningún compromiso en el repository de CVS durante mucho time, y ahora descubrí que se movieron a git también (aunque en Sourceforge, no en Github).

Mi pregunta ahora es: ¿cómo fusiono los cambios en el repository SF git en mi repository?

Lo que intenté hasta ahora:

  1. Agregar nuevo repository remoto 'upstream' apuntando al repository SF git
  2. git fetch upstream
  3. git checkout master
  4. git merge upstream/master

El último paso funciona sin errores, pero el git status me dice que master y origin / master han divergido. Hacer un git pull ahora genera muchos conflictos ("CONFLICT (add / add)").

Si simplemente ha estado modificando sus modificaciones en las sucursales importadas desde cvs, esto podría ser muy fácil. Mi primer bash sería hacer coincidir los commits con un text identificable en sus posts de confirmación, luego tratar de hacer coincidir los identificadores de los parches

Configuración: encuentre la confirmación base actual para su trabajo:

 currentbase=$(git merge-base master master@{u}) git show -s $currentbase 

Ahora para encontrar una confirmación correspondiente en upstream/master :

 git checkout upstream/master git show -s :/"some regex for unique-looking text in the $currentbase message" # and if that's right newbase=`git rev-parse !git:$` # !git:$ is last arg to previous git command 

y si eso no funciona, intente encontrar un compromiso que aplique el mismo parche:

 patchids=`mktemp` git rev-list upstream/master \ | while read; do git diff-tree -p $REPLY | git patch-id done >> $patchids # hunt up a commit that makes the same changes as $currentbase set -- `git diff-tree -p $currentbase | git patch-id` grep $2 $patchids # and if it finds one set -- $(!grep) # !grep is whole of last grep command newbase=$2 

Sin embargo lo encuentras, cuando obtienes el correcto

 git rebase --onto $newbase master@{u} master git branch -u upstream/master 

A partir de ahí, puede hacer lo de siempre, la git rebase pnetworkingeterminada es la stream arriba actual.

El problema es que los historiales de upstream / master y master son completamente diferentes (cada commit tiene un SHA1 diferente)

Necesita ver el historial de upstream / master, y determinar cuáles son las confirmaciones del repository de Sourceforge Git que son nuevas en comparación con su propio historial master .

Entonces tú puedes:

  • crea una twig a partir de la última confirmación común en tu twig master
  • git cherry-pick todos esos commits de upstream/master a esa nueva twig (que empieza desde master )
    (nota: puedes elegir cuidadosamente un range de commits )
  • luego fusiona esa nueva twig para master .