2011-01-04 6 views
11

Wyeksportowałem kilka zestawów zmian z mojego lokalnego roboczego repo po wykonaniu operacji pobierania z repozytorium serwera. Aby upewnić się, że łatki działają, sklonowałem nowe repozytorium z serwera i próbowałem zastosować zestaw zmian. Niestety, import nie powiedzie się z tym:Co zrobić, gdy poprawka do importu Mercurial nie powiedzie się?

applying G:\OSS\premake-dev\premake-dev_rev493.patch 
unable to find 'src/host/scripts.c' for patching 
3 out of 3 hunks FAILED -- saving rejects to file src/host/scripts.c.rej 
patching file src/base/api.lua 
patching file src/host/scripts.c 
patching file src/tools/bcc.lua 
file tests/test_bcc.lua already exists 
1 out of 1 hunks FAILED -- saving rejects to file tests/test_bcc.lua.rej 
patching file tests/premake4.lua 
patching file tests/test_bcc.lua 
abort: patch failed to apply 

[command interrupted] 

znam przyczynę niepowodzenia, to ze względu na usuniętego pliku źródłowego, które już nie istnieją w najnowszym changeset. Ale nie jestem pewien, jak naprawić poprawkę, aby mogła ona być czysto stosowana z bieżącym repozytorium serwera.

Jestem dość nowy w Mercurial, więc niektóre z używanych terminów nie będę zaznajomiony. Zauważ też, że nie mam uprawnień do zapisu do repozytorium serwerów Hg. Aby uzyskać mój zestaw zmian, muszę wyeksportować go jako poprawkę i przesłać do opiekunów.

+1

Jak o aktualizacji z powrotem do changeset łatka została zbudowana na, stosując ją, zobowiązując go, a następnie łącząc je z głowy? –

+0

@Lasse dzięki za sugestię. Dam ci to i spróbuj złożyć raport. To może być warte opublikowania jako odpowiedzi, więc łatwiej jest przegłosować – greatwolf

Odpowiedz

13

Muszę przyznać, że nie używałem łatek, więc może to nie być właściwy przepływ pracy, ale spróbowałbym, gdybym był w takiej sytuacji, by zastosować łatę do zestawu zmian, na którym pierwotnie był oparty.

Innymi słowy, to brzmi jak masz następujący przypadek:

    +-- you're here 
        | 
        v 
1---2---3---4---5---6 
    \ 
     \ 
     X <-- patch was built to change 2 to X 

Co bym zrobił, o ile znam changeset łatka została pierwotnie w oparciu o, byłoby zaktualizować z powrotem do tego changeset, zastosuj łatę, to doda kolejną głowę, a następnie połącz ją z czubkiem repozytorium.

Po tych działaniach, repozytorium powinno wyglądać następująco:

     +-- you're here 
         | 
         v 
1---2---3---4---5---6---8 
    \    /
     \    /
     7-------------/ 
    ^
     | 
     +-- this is the changeset you committed after applying the patch 

Teraz, na inny sposób.

Czy używanie łatki jest jedynym sposobem? Jednym z typowych sposobów używania Mercurial jest skonfigurowanie własnego repozytorium, widelca, zawierającego pierwotnie pełny klon centralnego repozytorium, ale masz dostęp do commitowania.

W ten sposób możesz zatwierdzić nowe zestawy zmian w swoim własnym klonie.

Jeśli centralne repozytorium ma nowe zestawy zmian dodane po sklonowaniu, w pewnym momencie wyciągniesz go z klonu i scalisz.

Następnie, gdy jesteś usatysfakcjonowany, wysyłasz prośbę o zwolnienie do opiekunów centralnego repozytorium, mówiąc im: "Hej, mam dla ciebie pewne zmiany, możesz wyciągnąć je z mojego klonu tutaj: http: // ... ".

W ten sposób naprawdę łatwo jest zapewnić wszystkim opiekunom, że wykonali dla nich ciężką pracę.

Oznaczałoby to, że masz dwa repozytoria tak:

central: 1--2 

clone: 1--2 

dodać swoją pracę:

central: 1--2 

clone: 1--2--3 

Dodają kilka Zestawienia zmian:

central: 1--2--3--4--5--6 

clone: 1--2--3 

Wtedy można wyciągnąć :

central: 1--2--3--4--5--6 

clone: 1--2--4--5--6--7 
      \ 
       \ 
       3 <-- this is your changeset 

Następnie połączyć:

central: 1--2--3--4--5--6 

clone: 1--2--4--5--6--7--8 
      \   /
       \  /
       3--------/ 

Jeśli opiekunowie teraz wyciągnąć od ciebie dostać one dokładnie taką samą historię w swoim repozytorium.

Istnieje również pewne wsparcie dla rebase, co oznaczałoby, że nie musiałeś ciągnąć i scalać, ale opiekunowie wydaliby polecenie "pull with rebase", w efekcie przenosząc twój zestaw zmian z jego aktualnej pozycji do nowego pozycja w ich repozytorium, wyglądałoby to następująco:

central: 1--2--3--4--5--6---7 
          ^
clone: 1--2--3   | relocated here 
       |   | 
       +------------+ 

Działa to tylko wtedy, gdy nie ma konfliktów scalania. Metoda, w której możesz ciągnąć i łączyć, jest dla nich najlepsza, ponieważ wykonujesz całą ciężką pracę, muszą jedynie sprawdzić, czy kod jest tym, czego chcą.

Aby uzyskać więcej informacji na temat wideł, sprawdź wideo Tekpub na CodePlex i Mercurial, tutaj: , odszukaj około 21:15, aby rozpocząć rozwidlanie.

Należy zauważyć, że "widelec" jest w zasadzie zwykłym klonem, sposób w jaki rozwidlenie działa w CodePlex polega na tym, że automatyzuje on tworzenie klona na własnym koncie i wysyłanie oryginalnym opiekunom żądania ściągnięcia, ale jeśli tworzymy własne konto na Bitbucket lub CodePlex lub cokolwiek innego, opublikuj tam swojego klona i po prostu wyślij opiekunom e-mail z adresem URL twojego repozytorium, to wszystko, co do niego należy.

+0

dzięki za obszerny spis. Uaktualnienie mojej głowy do wcześniejszego zestawu przed nałożeniem łatki zapewniło mi najwięcej. +1 do filmu wideo, był bardzo pomocny i sprawił, że niektóre rzeczy były wyraźniejsze. Myślę, że spróbuję tej metody na bitbucket. – greatwolf

+0

* "Hej, mam dla ciebie pewne zmiany, możesz je wyciągnąć z mojego klonu tutaj: http: // ...". * Czy proces uzyskiwania adresu URL dla mojego repozytu jest trudny? Sądzę, że mógłbym przesłać go na serwer, na którym jest repozytorium główne. – Noumenon

+0

Aby "wyciągnąć" gdzieś z adresu URL, potrzebujesz miejsca, w którym znajduje się twoje repozytorium. Możesz je hostować lokalnie za pomocą 'hg serve', ale prawdopodobnie będziesz musiał poradzić sobie z lokalnymi adresami IP, zaporami sieciowymi i portami itp. –

0

W moim przypadku mój błąd hg import był związany z zakończeniami linii. Rozwiązaniem było umieszczenie tego w moim pliku ~/.hgrc:

[patch] 
eol = auto 
+0

To również mi się przydarzyło, gdy Outlook zdecydował się usunąć" dodatkowe "zakończenia linii z mojej skrzynki pocztowej. Kliknięcie opcji przywracania zadziałało. – Noumenon