git - rebase do innego repozytorium

1

Problem jest taki: jak skleić dwa repozytoria na konkretnych commitach.

Jest repo A, i jego commit X.
Jest repo B, i jego commit Y, zawierający dokładnie tę samą treść (w sensie kodu źródłowego) co commit X w A.

Chodzi o uzyskanie repo AB, które będzie zawierało historię A aż do commita X, i historię B od commita Y począwszy, z zachowaniem blame'a (czyli żeby w miejscu połączenia X-Y nie wyglądało że się zmieniło wszystko, tylko że się nie zmieniło nic).

Albo inaczej: jak zrobić rebase z repo B do A, z zachowaniem wszystkich branczy i merge'ów, kiedy repozytoria nie są sobie pokrewne.

Albo jeszcze inaczej: jak skopiować commity z B do A inaczej niż przez żmudne ręczne generowanie diffów z jednego repo i commitowanie ich do drugiego.

0

Jeżeli tych commitów nie jest za dużo do skopiowania z A do B, możesz zrobić na nich cherry-picka ? historię będziesz miał w reflogu (git reflog)

0

By wszystko było jasne:

  1. masz dwa repozytoria nie posiadające wspólnej historii
  2. w obu repozytoriach jest wspólny kod (o małych różnicach) - zapewne jakiś kod importowany z innego projektu, który został neic zmodyfikowany odrobinę na obu branchach
  3. chcesz część wspólną kodu połączyć w jednym repozytorium

Pytanie co ma się dziać dalej z tym repo. Czy chcesz by dalej kod pozostał niezależny? Czy może lepiej by było by kod pozostał wsĻólny dla obu projektów?

Ja bym zrobił tak:

  1. zrobił kopię repozytoriów
  2. przepisał historię tak by repo zawierało jedynie kod, który ma być współdzielony (można to wyggoglać, już raz przez to przechodziłem, chyba robiłem według tej odpowiedzi: http://stackoverflow.com/a/359759/1387438).
  3. połączył oba wyekstrahowane repozytoria (zwykły pull brancha z innego repo powinien to zrobić)
  4. dołączył nowe repo do starego jako submodule

Inna kombinacje tez powinny zadziałać, ale reaczej musisz zrobić osobne repo z przepisaną historią (wyekstrahowanym kodem, który chcesz współdzielic)

0

masz dwa repozytoria nie posiadające wspólnej historii
Tak.

w obu repozytoriach jest wspólny kod (o małych różnicach)
Jest moment w obu repozytoriach, w którym kod jest identyczny, wynika to z tego, że w pewnym momencie zaimportowano źródła i kontynuowano w niezależym repo.

Nie chodzo o współdzielenie, tylko o naprawienie tego błędu, by uzyskać jednolite repo bez widocznych śladów łatania.

Sytuacja wygląda tak (rysunek poglądowy, commitów i branczy jest więcej)

git1.PNG

Czerwona kropka to miejsce skopiowania źródeł - diff jest zerowy.
W tym miejscu trzeba byłoby skleić oba repozytoria by uzyskać jednolitą historię:

git2.PNG

Końcówka pierwszego i początek drugiego są na straty. Dalszy rozwój odbywałby się na połączonym repo (źródłowe do kosza).

1

Propozycja rozwiązania problemu:

Tworzymy nowe puste repozytorium np. repoC i na nim wykonamy scalenie

Tworzymy powiazanie ze zdalnymi repozytoriami A oraz B
git remote add upstreamA .../repoA
git remote add upstreamB .../repoB

Aktualizujemy dane tych repozytoriów
git fetch upstreamB
git fetch upstreamA

Ściągamy stan z repoA do mastera
[master|✔] # git pull upstreamA master

Usuwamy wszystko po stanie X
[master|✔] # git reset --hard [X_commit_hash]

Wysyłamy/zatwierdzamy stan A..X
[master|✔] # git push

Tworzymy brancha z repoB
[master|✔] # git co -b repoB upstreamB/master

Wracamy na mastera
[repoB|✔] # git co master

Scalamy wszystko po commicie Y ze stanem mastera
[master|✔] # git rebase --onto master [Y_commit_hash] repoB

Rozwiązujemy konflikty
[:b9f865c|✖ 1✔] # git add .

Kontynuujemy scalenie
[:b9f865c|●1] # git rebase --continue

Obserwujemy jakie commity zostaną nałożone na master
Applying: commit1
Applying: commit2
[repoB ↓·7↑·7|✔]

Na repoB mamy repoA scalone z repoB [A..XY..B] (nie robimy pushy, pulli) przechodzimy na mastera
[repoB ↓·7↑·7|✔] # git co master

Scalamy mastera [A..X] ze stanem z repoB [A..XY..B], czyli dokładamy Y..B na koniec A..X
[master|✔] # git merge repoB --no-ff

Wysyłamy/zatwierdzamy gałąź [A..XY..B]
[master ↑·5|✔] # git push origin master

[master|✔]

RepoB możemy usunąć.

[Adam W.]

1 użytkowników online, w tym zalogowanych: 0, gości: 1