2012-05-10 14 views
28

Widziałem inne Mercurial Case-Folding Answers na StackOverflow - mówią, że jeśli masz dostęp do systemu plików wrażliwego na wielkość liter, takiego jak unix, sprawdź to i napraw to. Problem polega na tym, że nie mam dostępu do skrzynki unixowej, jestem programistą zajmującym się tworzeniem aplikacji windowsowych.Rozwiązywanie kolizji Mercurial Case-Folding w systemie Windows

Jak to naprawić bez pudełka uniksowego?

+0

Można zainstalować system Linux na maszynie wirtualnej, np. VirtualBox z instalacją Ubuntu. –

+6

To dużo pracy, aby rozwiązać problem, który został spowodowany przez trywialne zadanie, takie jak zmiana nazwy pliku! – reach4thelasers

+0

O ile mi wiadomo, najnowsze wersje Mercurial powinny mieć wbudowane zabezpieczenia przed kolizjami zwijania kolizji ... –

Odpowiedz

25

Jest to temat filesystem pomoc trwają prace, które zostaną uwzględnione w następnej wersji Mercurial:

https://www.mercurial-scm.org/pipermail/mercurial-devel/2012-April/039522.html

zmiana nazwy zderzających plików

W przypadku niewrażliwe systemów plików, aktualizacja do wersji z plikami ze zdarzeniami kolizji zostanie przerwana, nawet z --check lub --clean.

Aby naprawić takie poprawki, należy nadać nowe nazwy jednemu lub obu kolizyjnym plikom w systemie plików z rozróżnianiem wielkości liter i zatwierdzić je do utworzyć nową wersję bezpieczną dla kolizji.

.. Uwaga :: Jeśli chcą (lub muszą) przeglądać lub naprawa takich wersje na case-niewrażliwy systemów plików, zobacz „Aktualizacja ręcznie” sekcji.

Jeśli: GW: merge zostaje przerwana, ale: GW: update --check do siebie przeglądy osiągnięć, kolizja występuje między rewizji zostać połączone.

W takim przypadku należy zmienić nazwy plików w jednym z nich lub obu, aby uniknąć kolizji przed scaleniem.

Z ostatniej Mercurial można zmienić przypadek pliku bezpiecznie w krokach poniżej, nawet w przypadku systemów plików niewrażliwe ::

$ hg rename a.txt tmp 
$ hg rename tmp A.TXT 

Aktualizacja ręcznie

Jeśli chcesz (lub potrzeby do) aktualizowania katalogu roboczego przez wersję powodującą kolizję w przypadku rozróżniania wielkości liter w systemach plików niewrażliwych na wielkość liter , w celu zmiany nazwy plików powodujących kolizję lub przeglądania na przykład pod taką wersją, patrz na przykład strona Wiki poniżej ::

https://www.mercurial-scm.org/wiki/ManualCheckout

nie jest to zalecane dla zaawansowanych użytkowników non Mercurial.

Inny podobny sposób obsługi jest opisane tutaj:

https://www.mercurial-scm.org/wiki/FixingCaseCollisions

to również nurkuje raczej głąb Mercurial wewnętrznych chociaż, więc należy go unikać, chyba że w ostateczności.

+1

Musiałem użyć metody opisanej w http://mercurial.selenic.com/wiki/FixingCaseCollisions Chociaż nie musiałem najpierw wykonywać klona. –

+0

"W najnowszym Mercurial, możesz bezpiecznie zmienić wielkość liter w nazwie pliku, nawet w systemach plików niewrażliwych na wielkość liter ::" - to znaczy, jeśli wiesz o tym problemie przed sprawdzeniem zawartości, innymi słowy niedawne Mercurial nadal ma ten błąd skutecznie nierozwiązany. – Den

+0

Dlaczego mówisz, że jest błąd? Systemy plików wrażliwe na wielkość liter istnieją i obsługuje je Mercurial. Podczas dodawania pliku z konfliktem zwijania skrzynek w systemie rozróżniającym wielkość liter, Mercurial wyraźnie ostrzeże Cię o tym. Jeśli mimo to zdecydujesz się zignorować ostrzeżenie i je zatwierdzić, oznacza to, że wprowadziłeś kolizję przypadku i możesz odzyskać od niej informacje opisane powyżej. –

3

Aby uzyskać problem z zaginaniem etui w systemie Windows, zgaduję, że w repozytorium znajdują się różne przypadki w różnych gałęziach lub głowach, a to staje się problemem podczas łączenia. Nie widzę, jak (na Windows) rzeczywiście można uzyskać dwa różne przypadki w tej samej wersji bez przechodzenia przez system unixowy.

Tak więc, jeśli są one w różnych wersjach następnie można zrobić coś takiego:

hg update <some rev> 
hg remove -A -f "Some File" 

następnie scalanie uda ok. -A jest dla "po", a -f "wymusza".

11

Rozwiązaliśmy to bez uciekania się do systemu plików wrażliwego na wielkość liter, wydając polecenia zmiany nazwy HG. Powiedzmy, że są kłopoty, bo „foo.txt” powinien być nazywany „foo.txt”:

hg rename Foo.txt Foo.txt.renamed 
hg rename Foo.txt.renamed foo.txt 

wystąpił ten problem, kiedy plik został usunięty, a później ponownie utworzony w głównym repozytorium z tego samego nazwisko, ale inny przypadek. Repozytorium oddziałów, które zostało utworzone przed tymi zmianami, nie mogło zostać następnie scalone, pomimo usunięcia zestawów zmian z głównego repozytorium.

0

Miałem ten problem, ale korzystanie z systemu * nix nie było możliwe. Udało mi się go rozwiązać po these instructions.


W systemie Windows jest obecnie (przed Mercurial 1.1) możliwe jest wprowadzenie przypadków kolizji w repo, które uniemożliwiają sprawdzanie repozytorium.

Jednym ze sposobów naprawy takiego repozytorium jest sprawdzenie go w systemie Unix z uwzględnieniem wielkości liter, usunięcie problematycznego pliku i ponowne zatwierdzenie.

Jeśli nie jest to możliwe, można wykonać następujące czynności:

hg clone --noupdate repo repair 
cd repair 
hg debugsetparents <bad revision> 
hg debugrebuildstate 

W tym momencie Mercurial będzie, że masz złe rewizja wyrejestrowany i wszystkie pliki brakuje (stan „!”). Aby rozwiązać ten repo, po prostu trzeba zrobić:

hg remove --after <file causing the collision> 

stan hg Teraz powinien pokazać plik kłopotliwy w stanie „R” i wszystkie inne pliki w stanie „!”.Teraz możemy sprawdzić w naszej poprawki:

hg commit --message "fix case collision" 

Aby uzyskać wszystkie pliki z powrotem, po prostu sprawdź jeszcze raz:

hg update tip 

referencyjny: https://www.mercurial-scm.org/pipermail/mercurial/2008-June/019921.html

-1

Jak Laurens Holst że zmiana nazwy folderu/plik przechodzący przez tymczasowy system plików pracował dla mnie.

$ hg rename a.txt tmp 
$ hg rename tmp A.TXT 

Ale aby to działało, i uniknąć kolizji pliki błąd podczas scalania musiałem oczyścić po zmianie nazwy

3

jego regularne problemów w systemie Windows do nieużywania rozróżniana systemów plików. Jeśli chcesz to zrobić z TortoiseHg Workbench zainstalowanego przeszukać plik i zmienić jego nazwę:

prawym przyciskiem myszy/TortoiseHg/Zmień nazwę pliku

będzie zmienić nazwę pliku do wrażliwej nazwy prawy przypadku, gdy chcesz. Kolejne zdjęcie pokazuje jak zmieniłem XMLConverter dla XmlConverter

enter image description here

Następnie w Workbench można popełnić zmianę pliku:

enter image description here

ten został zaktualizowany tydzień później

Przedstawione rozwiązanie może daje ci problemy z późniejszym aktualizowaniem całego repozytorium z innego komputera. Ostatecznym sposobem rozwiązania tego problemu może być wykonanie 2 commitów:

  1. Jeden do zmiany nazwy plików o niechcianej nazwie na tymczasowy. Np .: XMLConverter2
  2. Kolejny do zmiany nazwy plików tymczasowych na nowe nazwy. Np .: XmlConverter

Więc to ma tak:

renaming the temporary files to the new names

To jest rzeczywiście droga robi dokonać konfliktów w systemie Windows już. Wygląda brzydko, ale jest skuteczny.

+1

Jeśli wykonasz dwa zatwierdzenia, czy są jakieś problemy z rebasem, które ponownie je scalają? – DaveInCaz

+0

Próbowałem jeszcze. Jeśli ktoś to robi, proszę podać wynik. – EliuX

1

Jeśli używasz Bitbucket.org, możesz przeglądać źródła w gałęzi problemu, przejść do pliku, kliknąć menu rozwijane przez zmianę, zmienić nazwę pliku (lub w naszym przypadku zmienić nazwę katalogu) zatwierdzić te zmiany i Ciągnąć.

Dziękuję zespołowi Bitbucket!

0

Wiem, że to stare pytanie, ale to właśnie dla mnie zadziałało i mam nadzieję, że komuś się przyda. W moim przypadku miałem repozytorium ze starego oddziału, które musiałem zamknąć.

użyłem Windows powłoki bash systemu Windows 10, aby rozwiązać ten lxrun /install a kiedy to było setup zainstalowaniu Mercurial sudo apt-get install mercurial To da Ci dostęp do systemu plików za pośrednictwem katalogu mnt, a można użyć Mercurial z wiersza poleceń .

W moim przypadku mógłbym wtedy łatwo zaktualizować problematyczny oddział i zamknąć go.