Ik heb een repo1
en repo2
op een lokale computer. Ze lijken erg op elkaar, maar de laatste is een soort andere tak (repo1
wordt 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 repo1
toe te passen op repo2
?
Moet ik een patch voorbereiden, of is het mogelijk om wat cherry-pick
te 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-patch
en vervolgens git am
om 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-pick
doen 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 ../repo
het 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 --3way
om 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