Uszkodzenie repozytorium Mercurial

14

Jest to nieco związane z tym pytaniem, ale jest innym pytaniem.

Mamy centralne repozytorium Hg, podawane użytkownikom za pośrednictwem SSH i serwera mercurial . Łączymy się z nim kilkoma klientami Mac, Linux i Windows.

Dwukrotnie zdarzyło się teraz, gdy jeden z użytkowników systemu Windows uszkodził swoje repozytorium, a następnie zepchnął z powrotem do centralnego, który je uszkodził. Chcę napisać przychodzący skrypt przechwytujący w centralnym repozytorium, aby zapobiec akceptacji transakcji, jeśli spowoduje ona uszkodzenie centralnego repozytorium.

Chociaż niestety nie wiem wystarczająco dużo o Mercurial, aby napisać taki skrypt. Czy jest jakaś możliwość, że spotkał się z tym ktoś inny? Osobiście nie jestem pewien, dlaczego hg domyślnie tego nie robi.

Bobinabottle
źródło
Znalazłem tutaj rozwiązanie: davidherron.com/blog/topics/…, które należałoby wykonać na wszystkich klientach. Ale jeśli ktoś ma lepsze rozwiązanie, które można zrobić dla samego centralnego repozytorium, byłoby lepiej.
bobinabottle,
Podaj nam więcej szczegółów: jakiej wersji Mercurial używasz na serwerze i na każdym z klientów?
Martin Geisler
2
Byłoby to również bardzo przydatne dla nas (deweloperów Mercurial), gdybyście mogli to odtworzyć. Prosimy również zgłaszać nam takie problemy bezpośrednio za pośrednictwem naszej listy mailingowej: mercurial.selenic.com/wiki/MailingLists lub narzędzia do śledzenia błędów: selenic.com/mercurial/bts Jest to o wiele bardziej produktywne niż publikowanie tutaj :-)
Martin Geisler

Odpowiedzi:

4

Najnowsze wersje Mercurial (od 1.5) obsługują sprawdzanie poprawności danych przychodzących. Dodaj

[server]
validate = True

do konfiguracji hg serwera (albo .hg/hgrckonfiguracja hgwebdir powinna działać poprawnie), aby serwer mógł zweryfikować przychodzące dane i odrzucić nieprawidłowe wypychania. Klient zobaczy wtedy błąd podobny do:

remote: abort: missing file data for beta:dddc47b3ba30e54484720ce0f4f768a0f4b6efb9 - run hg verify

Mam nadzieję, że to pomaga!

durin42
źródło
2

Może powinieneś całkowicie unikać pchania do repozytorium. Dzięki Mercurial i jego rozproszonej naturze każdy może mieć swoją gałąź, a kiedy czuje, że jest gotowy, mówi ci, a ty od niego odsuwasz. Brak problemów z dostępem do zatwierdzenia, brak wypychania, które mogłoby popsuć ...

To przynajmniej rada, której udzielił mi mój przyjaciel, kiedy migrowałem z SVN do Mercurial.

Nie wiem, czy jest to dla ciebie opcja, ale utworzenie osobistego repozytorium dla wszystkich, a następnie wyciągnięcie ludzi, których potrzebujesz, może wymagać mniej pracy niż próba złapania niebezpiecznych popychaczy.

AdamTheCamper
źródło
Nie naciskać na HG, pokonuje cały swój cel - wielu użytkowników współpracuje
Anonymouse,
0

Czy nie mógłbyś zrobić tego samego, co blog Davida Herrona , ale zamiast robić to w trakcie przygotowywania trasy, zrób to na specjalnym haczyku na centralnym repozytorium?

Ryan Gibbons
źródło
Nie :-( Próbowałem tego, ale kończy się to impasem. Gdy klient próbuje pchnąć, zastrzega sobie blokadę w repozytorium. Uruchomienie funkcji „weryfikacji hg” również wymaga blokady, więc kończy się to czekaniem na zawsze w niekończąca się pętla
bobinabottle
Ponadto, nawet jeśli zadziałało to w przypadku polecenia wstępnego, sprawdziłoby to repozytorium, upewniło się, że jest w porządku, a następnie zatwierdzi zmiany, które by go uszkodziły. Naprawdę potrzebowałbym haka, aby ocenić, czy nadchodzące zmiany spowodują uszkodzenie repozytoriów, jeśli tak, wycofaj transakcję. Dlatego sensowniej byłoby być na haku grupy zmian.
bobinabottle
(Użycie haka grupy zmian nadal powoduje zakleszczenia)
bobinabottle
Ciekawe - haki wydają się być oparte na pythonie. Czy wiesz, co psuje repozytorium? Czy za każdym razem to samo?
Ryan Gibbons,
0

Jedną z możliwych alternatyw jest:

  1. Sklonuj repozytorium PO wypchnięciu.
  2. Sprawdź to.
  3. Jeśli repozytorium jest dobre, zarchiwizuj je jako najnowsze dobre
  4. Jeśli repozytorium jest uszkodzone, podnieś alarm
  5. W razie alarmu przywróć ostatnie znane dobre repozytorium.

To rozwiązanie nie jest tym, czego potrzebujesz, ale przynajmniej masz sposób na wycofanie repozytorium w przypadku uszkodzenia.

Laurent Etiemble
źródło