2013-01-09 11 views
5

I importowane repozytorium Bazaar do Git (używając git bzr), ale wynikające repozytorium zawiera fałszywe popełnienia odnośnik nadrzędny:Usuń nieprawdziwy popełnić nadrzędny wskaźnik

Spurious parent link

zauważyć, że commit oznaczone 1.02-6 opiera się wyłączyć 1.02-3 commit, ale 1.02-1 jest również niepotrzebnie oznaczony jako rodzic. (Uwaga: Wszystkie rewizje w tej części repo są oznaczone, nie ma commity między pokazanych).

Próbowałem przebazowania na kilka sposobów (na master Branża: git rebase 1.02-3, git rebase -i upstream-1.02, git rebase --onto 1.02-1 1.02-3, git rebase --root upstream-1.02 --onto=other_branch) , ale w każdym przypadku kończy się to konfliktem. Wydaje się, że próbują więcej niż to konieczne; historia jest poprawna z wyjątkiem, aby dodatkowy znacznik nadrzędny był zapisywany w zatwierdzeniu oznaczonym 1.02-6.

Jak usunąć link w celu linearyzacji historii? Czy istnieje lepszy sposób niż ręczne wybieranie wszystkich zatwierdzeń w sekwencji?

+1

Czy to naprawdę „fałszywy”? Czy też zostały wprowadzone poprawki błędów do '1.02-1', które zostały połączone w' 1.02-6', ale nie zostały wprowadzone w '1.02-3' (lub zrobione tam przez inną ścieżkę)? Nie jest to znane z 'bzr' i zakładam, że powyższy wykres jest uproszczony tylko do oznaczonych wydań (tzn. Istnieją inne commity/changesets pomiędzy nimi, które po prostu nie są pokazywane w danym momencie). – twalberg

+0

@twalberg: Nie uproszczony. To są wszystkie zobowiązania. –

+0

Może być przydatny: http://git-scm.com/docs/git-commit-tree, 'git cat-file -p 1.02-6'' –

Odpowiedz

5

Można to zrobić ręcznie, używając wewnętrznego polecenia git commit-tree.

Chcemy edytować commit oznaczony 1.02-6, aby usunąć fałszywy wskaźnik nadrzędny (do 56a2f3b5948ab54c9239c2b384a6ea9eb1f410c4).

pierwsze, zapoznać się z informacjami z istniejącego popełnić obiektu:

[email protected]:/path/repo.git$ git cat-file -p 1.02-6 
tree c658aa1ebcf2bf2a607696c7868b875be72fb01f 
parent 56a2f3b5948ab54c9239c2b384a6ea9eb1f410c4 
parent 4e671bf1d2298729c9e5cfd8229051cfe2c40831 
author James Damour (Suvarov454) <[email protected]> 1146319620 -0400 
committer Bazaar Package Importer <[email protected]> 1146319620 -0400 

The "main/" in the Section line of debian/control should be assumed. 

Extract the commit message using git log --format=%B -n 1 1.02-6.

teraz utworzyć nowy popełnić o tej samej treści (z wyłączeniem fałszywego łącza nadrzędnego, a informacje committer):

git log --format=%B -n 1 1.02-6 | \ 
    GIT_AUTHOR_NAME="James Damour (Suvarov454)" \ 
    GIT_AUTHOR_EMAIL="[email protected]" \ 
    GIT_AUTHOR_DATE="1146319620 -0400" \ 
    git commit-tree c658aa1ebcf2bf2a607696c7868b875be72fb01f \ 
     -p 4e671bf1d2298729c9e5cfd8229051cfe2c40831 

Utworzono nowe zatwierdzenie i wydrukowano jego skrót (cc32e66 ...).Teraz włącz go do nowego oddziału:

git checkout -b fixed_commit cc32e66 

i rebase master na nowego oddziału:

git checkout master 
git rebase fixed_commit 

I skończymy:

Finished

Prawdopodobnie chcesz usunąć stare gałęzie i ponownie oznaczyć odpowiednie zatwierdzenia.


Właściwie może być łatwiej używać git filter-branch --parent-filter. Nie próbowałem tego.

1

Możesz wypróbować numer rebase. Jest przykład nieco w dół (szukaj --onto), który moim zdaniem jest podobny do twojego przypadku.

myślę trzeba zrobić

git rebase --onto 1.02-1 1.02-3 

który powinien umieścić wszystko po 1.02-3 na 1.02-1 i to jest chyba to, co chcesz.

Pamiętaj, że skróty będą różne w przypadku wszystkich zmian od pierwszego zmienionego zatwierdzenia, ale zakładam, że robisz to jako pierwszy krok w kierunku przejścia z bzr, więc nikt inny nie powinien tego jeszcze sklonować.

+0

To daje mnóstwo konfliktów scalających. Wydaje się, że próbujesz zrobić więcej, niż to konieczne. –

1

To poprawi rodziców bez zmieniania czegokolwiek innego (np daty committer.):

git filter-branch --tag-name-filter cat --parent-filter 'test $GIT_COMMIT = [sha of 1.02-6] && echo "-p [sha of 1.02-3]" || cat' -- 1.02-1..master

Będziesz musiał zastąpić nawiasami tekstu z odpowiednią popełnić identyfikatory. Jeśli masz więcej gałęzi podrzędnych, które wymagają przepisania, zmień 1.02-1..master na --all i przygotuj się na czekanie.

Oczywiście, nie używaj tego ani żadnego innego rozwiązania, jeśli inni mają rozgałęzione od zatwierdzeń po tych, które chcesz edytować. Będą cię nienawidzić.

+0

Jeśli nie potrzebujesz dbać o innych (na przykład w przypadku czyszczenia zaraz po konwersji z svn lub bzr na git i przed odłożeniem na serwer git), to jest to najlepsza odpowiedź. Próbowałem ich wszystkich. –

10

Najprostszym sposobem, aby to zrobić (w git> = 1.6.5) jest użycie:

git replace --edit <sha> 

i usunąć/dodać/zmienić nadrzędny: linie.

Gdy jesteś zadowolony zmiana ma rację, można przepisać zobowiązuje się dokonać zmiana na stałe:

git filter-branch --tag-name-filter cat -- --all 
+1

Prosty i bezpośredni do punktu bez wielu poleceń podatnych na błędy. To powinna być zaakceptowana odpowiedź! –

+2

Uwaga możemy uruchomić drugie polecenie jako 'git filter-branch --tag-name-filter cat - ..head', więc przepisujemy tylko wymagane zatwierdzenia, a nie każde zatwierdzenie. Obsługiwane argumenty są udokumentowane tutaj https://www.kernel.org/pub/software/scm/git/docs/git-rev-list.html – Michael

+0

uwaga, w jakiś sposób to rozbił sourcetree na mac na stałe – HopefullyHelpful

Powiązane problemy