2012-11-05 10 views
5

Napisałem i utrzymuję narzędzie open source o nazwie reposurgeon, które edytuje historie repozytoriów kontrolek wersji i może być używane do przenoszenia historii projektów między VCSes. Niedawno otrzymałem pełną obsługę odczytu plików zrzutu Subversion i repo. Ale jest jedna rzecz, której repozytoror jeszcze nie radzi sobie zbyt dobrze, a to tłumaczy scalanie gałęzi Subversion przez kopiowanie do scaleń DIT w stylu git.Jakie są semantyki merge strumieni szybkiego importu git?

Aby ta część była poprawna, muszę zrozumieć semantykę scalania w strumieniu szybkiego importu git o wiele lepiej niż ja. Moje pytania dotyczą tego, która wersja treści ma być widoczna po zatwierdzeniu scalenia.

Oczywiście dołączono modyfikacje plików, zatwierdzenie scalenia powoduje, że ich zawartość jest widoczna. Moje pytania dotyczą ścieżek nie dotknięte przez zatwierdzenie.

  1. Jeśli ścieżka zawiera tylko treść tylko jednego łańcucha commit do scalenia, zakładam, że treść ma być widoczna. Czy to jest poprawne?

  2. Jeśli ścieżka ma treść w więcej niż jednym łańcuchu zatwierdzenia w stosunku do scalenia, która wersja będzie widoczna?

  3. Jeśli plik zostanie usunięty wzdłuż niektórych ścieżek do scalenia, jaka reguła przewiduje, kiedy zostanie usunięta w wersji scalonej?

Odpowiedz

6

Jeśli dobrze rozumiem twoje pytanie, zastanawiasz się, jakie skróty fast-import pozwala ci wziąć pod uwagę podczas przesyłania zawartości commit.

O ile wiem od czytania git/fast-import.c i strony podręcznika, szybkie importowanie inicjalizuje drzewo dla nowego zatwierdzenia z drzewa, które zostało dostarczone w poleceniu "od". "filemodify" i przyjaciele zaczynają od tego stanu, aby skonstruować nowe drzewo, które zostanie zatwierdzone na końcu.

Polecenie szybkiego importu nie wydaje się w ogóle zmieniać drzewa podczas napotykania poleceń "scalania"; Jeśli chcesz dołączyć zmiany od rodziców innych niż pierwsze, musisz dokładnie określić, które pliki chcesz wprowadzić. Możesz użyć znaczników lub skrótów obiektu, aby nadać nazwy plikom innych gałęzi dla "filemodify".


edytuj: Ah, przejdźmy głębiej do modelu git.

W git, commit wskazuje drzewo, które reprezentuje całą zawartość śledzonej hierarchii katalogów, tak jak to miało miejsce w momencie zatwierdzenia. Zobowiązania nie zawierają żadnych informacji o tym, jak różnią się od rodziców; teoria jest taka, że ​​można odtworzyć różnicę, jeśli jej potrzebujesz, porównując te drzewa.

Zatwierdzenie scalenia odróżnia się od braku łączenia tylko dlatego, że ma dwóch lub więcej rodziców. Wciąż ma jedno drzewo, rejestrując dokładnie to, co jest w wersji, która wynika z wykonania scalenia. Wciąż nie zapisuje nic o tym, jak jego autor połączył rodziców w scaloną wersję. Git "porcelana" nakazuje jak magia, aby zrekonstruować użyteczny opis tego, co się stało.

Koncepcyjnie, aby utworzyć nowy obiekt zatwierdzania, należy opisać pełne odwzorowanie ścieżek do zawartości pliku, która znajduje się w tym zatwierdzeniu. (Dużo sprytu idzie na robienie tego sprawnie i prosto zamiast okropnie.)

Polecenie git fast-import udostępnia skrót dla zwykłego przypadku: zwykle wywoływane przez VCS informacje o tym, jak to zatwierdzenie zostało utworzone jako pewnego rodzaju różnice od ostatniego zatwierdzenia w tej samej gałęzi. W takim przypadku możesz efektywnie zakodować plik diff w formacie strumienia szybkiego importu, aby uzyskać prostszy i szybszy import.

Ale musisz pamiętać, że to tylko skrót do ponownego skonstruowania całego drzewa od zera.

+0

Er, jeśli szybki import nie zmienia drzewa w odpowiedzi na polecenie scalania, to co oznacza polecenie scalania *? – ESR

+2

W trybie szybkiego importu dodaje on tylko drugie (lub trzecie, czwarte, ...) zatwierdzenie nadrzędne do obiektu commit, który aktualnie tworzysz. –

+0

Co jednak oznacza dodanie zatwierdzenia nadrzędnego *, jeśli nie spowoduje to zmiany drzewa w wersji scalonej? Jakie informacje zawiera ten link dla rodzica? – ESR

Powiązane problemy