2012-05-10 17 views
28

Tôi đã nhìn thấy các câu trả lời của trường hợp Mercurial khác trên StackOverflow - họ nói rằng nếu bạn có quyền truy cập vào hệ thống tệp nhạy cảm như unix thì hãy kiểm tra và sửa lỗi. Vấn đề là, tôi không có quyền truy cập vào một hộp unix, tôi là một nhà phát triển cửa sổ đang phát triển một ứng dụng cửa sổ.Giải quyết sự va chạm của Mercurial Case-Folding trong Windows

Làm cách nào để khắc phục điều này mà không có hộp Unix?

+0

Bạn có thể cài đặt Linux trong máy ảo, ví dụ: VirtualBox có cài đặt Ubuntu. –

+6

Thats rất nhiều công việc để giải quyết một vấn đề đã được gây ra bởi một nhiệm vụ tầm thường như đổi tên một tập tin! – reach4thelasers

+0

Theo như tôi biết các phiên bản gần đây của Mercurial nên có các biện pháp bảo vệ tích hợp chống va chạm gấp ... –

Trả lời

25

Có một chủ đề filesystem giúp đỡ được làm việc trên đó sẽ được bao gồm trong phiên bản tiếp theo của Mercurial:

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

đổi tên va chạm file

Mở hệ thống tập tin case-insensitive, cập nhật các bản sửa đổi có các tệp có xung đột vụ án sẽ bị hủy bỏ, ngay cả với --check hoặc --clean.

Để sửa các sửa đổi như vậy, bạn nên đặt tên mới cho một hoặc cả hai tệp va chạm trên hệ thống tệp phân biệt chữ hoa chữ thường và cam kết tạo bản sửa đổi va chạm mới.

.. lưu ý :: Nếu bạn muốn (hoặc cần) duyệt hoặc sửa chữa sửa đổi trên hệ thống tệp phân biệt chữ hoa chữ thường, vui lòng xem phần 'Cập nhật theo cách thủ công'.

Nếu: hg: merge bị hủy bỏ, nhưng: hg: update --check cho mỗi sửa đổi thành công, va chạm xảy ra giữa sửa đổi để được hợp nhất.

Trong trường hợp này, các tệp trong một trong hai tệp hoặc cả hai phải được đổi tên để tránh va chạm trước khi hợp nhất.

Với Mercurial gần đây, bạn có thể thay đổi trường hợp của tên tập tin một cách an toàn trong các bước dưới đây, ngay cả trên case-insensitive hệ thống tập tin ::

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

Đang cập nhật bằng tay

Nếu bạn muốn (hoặc cần để) cập nhật thư mục làm việc bằng cách sửa đổi gây ra vụ va chạm gấp chữ hoa chữ thường trên các hệ thống tệp phân biệt chữ hoa chữ thường, để đổi tên tệp va chạm hoặc duyệt nội dung tại ví dụ sửa đổi ví dụ, vui lòng xem trang Wiki dưới đây ::

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

này là không nên cho người không chuyên gia sử dụng Mercurial.

Một phương pháp thủ công tương tự được mô tả ở đây:

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

này cũng lặn khá sâu vào internals Mercurial mặc dù, vì vậy bạn nên tránh nó trừ khi như một phương sách cuối cùng.

+1

Tôi đã phải sử dụng phương pháp được mô tả trong http://mercurial.selenic.com/wiki/FixingCaseCollisions Mặc dù tôi không cần phải làm bản sao đầu tiên. –

+0

"Với Mercurial gần đây, bạn có thể thay đổi trường hợp tên tập tin một cách an toàn theo các bước dưới đây, ngay cả trên hệ thống tập tin không phân biệt chữ hoa chữ thường" - đó là nếu bạn biết về vấn đề trước khi kiểm tra nội dung, nói cách khác Mercurial gần đây vẫn có lỗi này một cách hiệu quả chưa được giải quyết. – Den

+0

Tại sao bạn nói có lỗi? Hệ thống tệp phân biệt chữ hoa chữ thường tồn tại và Mercurial hỗ trợ chúng. Khi thêm một tệp có xung đột gấp chữ hoa chữ thường trên một hệ thống phân biệt chữ hoa chữ thường, Mercurial sẽ cảnh báo bạn một cách rõ ràng về nó. Nếu bạn quyết định bỏ qua cảnh báo và vẫn chấp nhận cảnh báo, thì có bạn đã giới thiệu một vụ va chạm vụ án và bạn có thể khôi phục từ trường hợp đó như được mô tả ở trên. –

3

Để gặp sự cố gấp trên cửa sổ, tôi đoán bạn đã có các trường hợp khác nhau ở các chi nhánh hoặc thủ trưởng khác nhau trong repo và nó sẽ trở thành vấn đề khi hợp nhất. Tôi không thể thấy như thế nào (trên Windows), bạn sẽ thực sự nhận được hai trường hợp khác nhau trong cùng một sửa đổi mà không đi qua một hộp unix.

Vì vậy, nếu họ đang có trong phiên bản khác nhau thì bạn có thể làm điều gì đó như thế này:

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

sau đó hợp nhất sẽ thành công ok. Các -A là cho 'sau', và -f sẽ 'lực'.

11

Chúng tôi đã giải quyết vấn đề này mà không cần đến hệ thống tệp phân biệt chữ hoa chữ thường bằng cách phát hành lệnh đổi tên HG. Giả sử bạn đang gặp sự cố do "foo.txt" cần phải được gọi là "foo.txt":

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

Chúng tôi gặp phải vấn đề này khi một tập tin đã bị xóa và sau đó tái tạo trong kho chính với cùng tên, nhưng trường hợp khác nhau. Một kho lưu trữ chi nhánh đã được tạo ra trước khi những thay đổi này không thể được sáp nhập vào, mặc dù các thay đổi từ kho lưu trữ chính đã được kéo.

0

Tôi gặp sự cố này nhưng sử dụng hệ thống * nix không phải là một tùy chọn. Tôi đã có thể giải quyết nó sau these instructions.


Trên Windows, hiện tại (trước Mercurial 1.1) có thể giới thiệu các vụ va chạm trong trường hợp ngăn bạn kiểm tra kho lưu trữ.

Một cách để sửa chữa kho lưu trữ như vậy là kiểm tra nó trên một hệ thống Unix phân biệt chữ hoa chữ thường, xóa tệp có vấn đề và cam kết lại.

Nếu đó là không thể, bạn có thể làm như sau:

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

Tại thời điểm này, Mercurial sẽ nghĩ rằng bạn có phiên bản xấu kiểm tra ra và tất cả các file bị thiếu (tình trạng '!'). Để khắc phục repo, chúng tôi chỉ cần thực hiện:

hg remove --after <file causing the collision> 

Hiện trạng hg sẽ hiển thị tệp phiền toái trong trạng thái 'R' và tất cả các tệp khác trong trạng thái '!'.Bây giờ chúng ta có thể kiểm tra trong sửa chữa của chúng tôi:

hg commit --message "fix case collision" 

Để có được tất cả các file của chúng tôi trở lại, chúng tôi chỉ kiểm tra một lần nữa:

hg update tip 

tham khảo: https://www.mercurial-scm.org/pipermail/mercurial/2008-June/019921.html

-1

Như Laurens Holst nói đổi tên thư mục/tệp đi qua hệ thống tệp tạm thời hoạt động cho tôi.

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

Tuy nhiên, để làm cho nó hoạt động, và tránh va chạm file lỗi trong quá trình hợp nhất tôi đã phải dọn dẹp sau khi đổi tên

3

của nó là một vấn đề thường xuyên trong Windows không sử dụng case-sensitive hệ thống tập tin. Nếu bạn muốn làm điều đó với TortoiseHg Workbench cài đặt, tìm kiếm file và đổi tên nó:

click chuột phải/TortoiseHg/Đổi tên file

Nó sẽ đổi tên tập tin với tên nhạy cảm trường hợp phải bạn muốn. Bức tranh tiếp theo cho thấy làm thế nào tôi thay đổi XMLConverter cho XmlConverter

enter image description here

Sau đó, trong Workbench bạn có thể cam kết những thay đổi tập tin:

enter image description here

này được cập nhật một tuần sau đó

Giải pháp được trình bày có thể cung cấp cho bạn các vấn đề sau này cập nhật toàn bộ kho lưu trữ từ một máy tính khác. Vì vậy, cách cuối cùng để giải quyết vấn đề đó có thể là 2 cam kết:

  1. Một để đổi tên tệp có tên không mong muốn thành một số tạm thời. Ví dụ: XMLConverter2
  2. Cách khác để đổi tên tệp tạm thời thành tên mới. Ex .: XmlConverter

Vì vậy, nó đã như thế này:

renaming the temporary files to the new names

Đây thực sự là cách thức mà nó doesnt quyết được xung đột trong Windows nữa. Nó trông xấu xí nhưng nó có hiệu quả.

+1

Nếu bạn thực hiện hai cam kết là có bất kỳ vấn đề nào xảy ra, việc rebase thu gọn chúng lại với nhau không? – DaveInCaz

+0

Tôi đã thử chưa. Nếu ai đó làm điều đó xin vui lòng cho kết quả. – EliuX

1

Nếu bạn đang sử dụng Bitbucket.org, bạn có thể duyệt nguồn trên nhánh sự cố, chuyển đến tệp, nhấp vào menu thả xuống bằng cách chỉnh sửa, đổi tên tệp (hoặc trong trường hợp đổi tên thư mục). kéo.

Cảm ơn nhóm Bitbucket!

0

Tôi biết đây là một câu hỏi cũ nhưng đây là những gì làm việc cho tôi và tôi hy vọng nó được sử dụng cho một ai đó. Trong trường hợp của tôi tôi đã có một repo di sản với một chi nhánh cũ tôi cần phải đóng cửa.

Tôi đã sử dụng Windows bash shell của Windows 10 để giải quyết lxrun /install và sau đó khi thiết lập tôi đã cài đặt mercurial sudo apt-get install mercurial Điều này sẽ cho phép bạn truy cập vào hệ thống tệp của mình qua thư mục mnt, và bạn có thể sử dụng mercurial từ dòng lệnh .

Trong trường hợp của tôi, tôi có thể dễ dàng cập nhật chi nhánh có vấn đề và đóng nó.

Các vấn đề liên quan