Rýchly a špinavý spôsob, akým zvyčajne spájam súkromné repozitáre, je
použiť možnosť --rebase pre git pull. O tejto možnosti som už písal v
príspevku o
udržiavaní git forku v sync s upstream-om.
Takto to funguje:
git remote add --fetch other ../other-repository
git pull --rebase other main
Toto je obzvlášť dobré, ak je málo alebo vôbec žiadne konflikty na riešenie. Ďalšou výhodou je, že umiestni commity z toho druhého repozitára na spodok histórie, takže vaša nedávna práca je na rovnakom mieste, aspoň vizuálne v git log. Remote možno teraz bezpečne odstrániť:
git remote remove other
Zjavnou nevýhodou tohto spôsobu spájania repozitárov je, že prepíše git históriu. Aj keď najnovšie commity vyzerajú nedotknuté, ich hashe sa zmenili. To znamená, že použitie tejto metódy na čokoľvek iné ako lokálne súkromné repozitáre sa neodporúča. Považujte to jednoducho za rýchlu nenápadnú alternatívu pre vašu lokálnu prácu.
Zachovanie chronologického poradia commitov #
Spojenie dvoch nesúvisiacich repozitárov do jedného pri zachovaní histórie commitov v chronologickom poradí je niečo, čo som sa už niekoľkokrát pokúšal vyhľadať, no ponúkané riešenia sú zvyčajne tieto dve:
- Merge na vrch a potom cherry-pick commitov
- Merge na vrch a potom interaktívny rebase
Obe riešenia však vyžadujú veľa manuálnej práce a sú náchylné na chyby. Existujú samozrejme nejaké lepšie alebo horšie skripty, ktoré to robia automaticky a môžu byť celkom efektívne, tu je súhrn odkazu pre záznam:
git init
git remote add --fetch repoA ../repoA
git remote add --fetch repoB ../repoB
# Mágia
git log --all --oneline --format="%at %H" | \
sort | cut -c12- | xargs -I {} sh -c \
'git format-patch -1 {} --stdout | git am --committer-date-is-author-date'
Toto mi tiež fungovalo. Používajte opatrne, keďže aj toto prepíše git históriu!