git: appliquer les modifications introduites par commit dans un repo à un autre référentiel

J’ai un repo1 et repo2 sur la machine locale. Ils sont très similaires, mais ce dernier est une autre sorte de twig ( repo1 n’est plus maintenu).

 /path/to/repo1 $ git log HEAD~5..HEAD~4  Add: Introduce feature X 

Comment appliquer les modifications apscopes par commit dans repo1 à repo2 ?

Dois-je préparer un patch ou est-il possible de faire un cherry-pick parmi les mises en pension?

Que diriez-vous de faire la même chose mais pour la gamme de commits?

En tant que hack, vous pouvez essayer de modifier la recette pour comparer les commits dans deux référentiels différents sur la page GitTips , à savoir:

 GIT_ALTERNATE_OBJECT_DIRECTORIES=../repo/.git/objects \ git cherry-pick $(git --git-dir=../repo/.git rev-parse --verify ) 

../repo est le chemin d’access à l’autre référentiel.

Avec Git moderne, vous pouvez utiliser plusieurs révisions et gammes de révision avec la sélection par cerise .

Le $(git --git-dir=../repo/.git rev-parse --verify ) est là pour traduire (par exemple HEAD , ou v0.2 , ou master~2 , qui sont des valeurs dans le deuxième référentiel que vous copiez) dans l’identifiant SHA-1 de commit. Si vous connaissez SHA-1 d’un changement que vous souhaitez sélectionner, ce n’est pas nécessaire.

Notez toutefois que Git peut ignorer la copie d’objects à partir du référentiel source, car il ne sait pas que le référentiel d’objects alternatifs n’est que temporaire, pour une opération. Vous devrez peut-être copier des objects du second référentiel avec:

 GIT_ALTERNATE_OBJECT_DIRECTORIES=../repo/.git/objects git repack -a -d -f 

Cela place ces objects empruntés au second référentiel dans le stockage du référentiel d’origine

Pas testé.


Une solution pas si pirate consiste à suivre knittl answer :

  • Accédez au deuxième référentiel à partir duquel vous souhaitez copier les commits, et générez des correctifs à partir des commits souhaités avec git format-patch
  • En option, copiez les correctifs (0001- *, etc.) dans votre référentiel
  • Utilisez git am --3way pour appliquer des patchs

Vous souhaitez probablement utiliser git format-patch et ensuite appliquer ce correctif à votre référentiel.

 /path/to/1 $ git format-patch sha1^..sha1 /path/to/1 $ cd /path/to/2 /path/to/2 $ git am -3 /path/to/1/0001-…-….patch 

Ou, en une seule ligne:

 /path/to/2 $ git --git-dir=/path/to/1/.git format-patch --stdout sha1^..sha1 | git am -3 

Vous pouvez faire un cherry-pick si vous ajoutez le second référentiel en tant que télécommande au premier (puis à l’ fetch ).

J’ai écrit un petit script pour appliquer la sortie diff de repo diff https://github.com/raghakh/android-dev-scripts/commit/a57dcba727d271bf2116f981392b0dcbb22734d0