git: Wijzigingen die door commit in de ene repo zijn geïntroduceerd toepassen op een andere repo

Ik heb een repo1en repo2op een lokale computer. Ze lijken erg op elkaar, maar de laatste is een soort andere tak (repo1wordt niet meer onderhouden).

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

Hoe wijzigingen aangebracht door commit <some_sha>in repo1toe te passen op repo2?

Moet ik een patch voorbereiden, of is het mogelijk om wat cherry-pickte doen tussen de repo’s?

Wat dacht je van hetzelfde te doen, maar dan voor een reeks commits?


Antwoord 1, autoriteit 100%

U wilt waarschijnlijk git format-patchen vervolgens git amom die patch op je repository toe te passen.

/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

Of, in één regel:

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

Antwoord 2, autoriteit 48%

Je kunt cherry-pickdoen als je de tweede repo als afstandsbediening toevoegt aan de eerste (en dan fetch).


Antwoord 3, autoriteit 14%

Als hack kun je proberen het recept voor het vergelijken van commits in twee verschillende repositories aan te passen op GitTips-pagina, dat wil zeggen:

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

waar ../repohet pad is naar de andere repository.

Met moderne Git kun je meerdere revisies en revisiebereiken gebruiken met cherry-pick.

De $(git --git-dir=../repo/.git rev-parse --verify <commit>)
is hier om <commit>te vertalen (bijvoorbeeld HEAD, of v0.2, of master~2, wat waarden zijn in de tweede repository waaruit u kopieert) naar SHA-1 identifier van commit. Als je SHA-1 weet van een wijziging die je wilt kiezen, is dat niet nodig.

OPMERKINGechter dat Git het kopiëren van objecten uit de bronrepository kan overslaan, omdat het niet weet dat de alternatieve objectrepository slechts tijdelijk is, voor één bewerking. Mogelijk moet u objecten uit de tweede repository kopiëren met:

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

Hiermee worden de objecten die zijn geleend van de tweede repository in de originele repository-opslag geplaatst

Niet getest.


Een niet zo hacky oplossing is om knittl antwoordte volgen:

  • Ga naar de tweede repository waar je commits van wilt kopiëren, en genereer patches van commits die je wilt met git format-patch
  • Kopieer optioneel patches (0001-* etc.) naar uw repository
  • Gebruik git am --3wayom patches toe te passen

Antwoord 4, autoriteit 3%

Ik heb een klein script geschreven voor het toepassen van de diff-uitvoer van repo diff
https://github.com/raghakh/android-dev-scripts/commit/a27981392167

Other episodes