2011-12-01 29 views
14

Tôi đang gặp sự cố với người dùng không thể đẩy các cam kết của mình vào một kho lưu trữ Mercurial và tôi bối rối vì sao nó không hoạt động cho anh ta. Tôi đã thử một vài điều để tìm hiểu điều gì đang xảy ra, Googling không bật lên bất cứ điều gì hữu ích ... vì vậy tôi ở đây.Tại sao Mercurial trả về "Hủy bỏ: Truy cập bị từ chối" khi cố gắng đẩy một kho lưu trữ?

Đầu tiên, cấu hình. Chúng tôi có một máy tính Windows XP SP2 x64 trên mạng của chúng tôi hoạt động như máy chủ lưu trữ chính thức của chúng tôi. Điều này có chứa một số kho lưu trữ trên đó. Chúng tôi nhân bản/đẩy/kéo bằng cách sử dụng một thư mục trên ổ đĩa đó được chia sẻ. Quyền được cấp cho mọi người để truy cập đọc. Người dùng có thể đẩy (bao gồm cả người dùng có vấn đề), được kiểm soát hoàn toàn. Máy của người dùng dựa trên Win XP. Máy của tôi (được sử dụng để giúp khắc phục sự cố) cũng là Win XP.

Thứ hai, các triệu chứng. Người dùng đang sử dụng TortoiseHg 2.1.1 để thực hiện công việc của mình. Ông có thể sao chép tốt, cam kết repo địa phương của mình là a-o-k, vv Khi ông cố gắng để đẩy, tuy nhiên, TortoiseHg trả về một "hủy bỏ, ret 255" mã. Không phải rất hữu ích. Vì vậy, chúng tôi đã đi đến dòng lệnh và đã ban hành "hg push -v --debug". Ở đây nó trả về "hủy bỏ: Truy cập bị từ chối". Cùng một người dùng này có thể ghi vào thư mục chia sẻ của máy chủ không có vấn đề gì - anh ta có thể tạo các tập tin, thư mục và xóa như vậy. Vì vậy, đọc/ghi truy cập vào ổ đĩa/thư mục không phải là một vấn đề.

Thứ ba, kết quả thử nghiệm của chúng tôi. Đây là một số kết quả lạ từ thử nghiệm. Người dùng đã tạo một repo thử nghiệm cục bộ mới. Tôi đăng nhập vào máy chủ và tạo ra một repo thử nghiệm cho anh ta để đẩy đến. Người dùng đã kiểm tra trong một tệp và sau đó đẩy nó lên đến repo thử nghiệm trên máy chủ. Điều này làm việc tốt. Không hủy bỏ. Cuộc sống là tốt. Anh ta có thể thực hiện thêm một vài cú đẩy và nó tiếp tục hoạt động như mong đợi. Sau đó tôi sao chép bản ghi nhớ vào máy của tôi, cập nhật một tệp và đẩy nó trở lại. Sau khi người dùng sau đó kéo các thay đổi của tôi và cố gắng đẩy trở lại máy chủ, anh lại một lần nữa gặp phải thông báo "Truy cập bị từ chối". Trong khi đó, tôi vẫn có thể cập nhật dự án mà không gặp bất kỳ vấn đề gì.

Là một thử nghiệm khác, chúng tôi đã đăng xuất người dùng và một người dùng khác đăng nhập. Họ đã làm như vậy và có thể đẩy tới repo máy chủ mà không gặp sự cố. Người dùng gốc đăng nhập lại, thực hiện một số thay đổi, v.v. và một lần nữa chạm vào bức tường gạch của "Truy cập bị từ chối".

Theo như chúng tôi có thể biết, sự cố không liên quan đến thông tin đăng nhập Windows. Nếu không, chúng tôi hy vọng rằng việc tạo các tệp tùy ý trên thư mục được chia sẻ của máy chủ sẽ không hoạt động. Hơn nữa, cho đến khi tôi thực hiện một bản cập nhật cho repo thử nghiệm mà người dùng đã tạo, anh ta có thể đẩy đến repo cụ thể đó.

Bất kỳ ý tưởng nào? Kiểm tra chứng nhận bổ sung nào là việc Mercurial có thể gây ra điều này?

UPDATE:

Sau một mẹo từ Wim, tôi bắt đầu nhìn vào các điều khoản trên các đối tượng khác nhau của repo sử dụng 'cacls'. Đây là một công cụ Windows "hiển thị hoặc sửa đổi danh sách kiểm soát truy cập của các tập tin". Tôi đã có người dùng tạo một repo mới và sau đó lấy một bản chụp của các điều khoản. Sau đó tôi kiểm tra trong một tập tin để cùng một repo và lấy một bản chụp của những thay đổi.

Nó chỉ ra rằng có một số quyền tệp repo được cập nhật như là kết quả của việc này: undo.bookmarks, undo.branch, undo.desc, undo.dirstate, chi nhánh, 00changelog.i, 00manifest.i, hoàn tác và tệp duy nhất của kho lưu trữ. Tất cả các tệp này đều có quyền tương tự như sau:

C:\Projects\Mercurial\hgtest4\.hg\store\undo BUILTIN\Administrators:F 
             NT AUTHORITY\SYSTEM:F 
             DOMAINxxxx\USERIDxxxx:F 
             BUILTIN\Users:R 

(giá trị DOMAINxxxx và USERIDxxxx thực tế đã bị thay đổi). Trước khi đăng ký của tôi, DOMAINxxxx & USERIDxxxx phản ánh tên miền và userid của người dùng.Sau khi check-in của tôi, chúng được cập nhật cho tôi (chúng tôi đang ở trên cùng một miền, nhưng userid rõ ràng là khác nhau.) Tôi có thể kiểm tra mọi thứ trong và ngoài mặc dù userid của tôi không được liệt kê vì tôi ' m là thành viên của nhóm BUILTIN \ Administrators. Người dùng có vấn đề thì không. Vì vậy, tôi đoán rằng sau khi tôi kiểm tra mọi thứ, hệ thống không còn thấy anh ta là người dùng có giấy phép với quyền truy cập ghi (BUILTIN \ User: R cho biết quyền truy cập chỉ đọc) và do đó khiến cho truy cập bị từ chối.

Tôi đã khắc phục sự cố Q & D ngay bây giờ (người dùng hiện là một phần của nhóm Quản trị viên ...) Bản sửa lỗi thực sự sẽ giúp bạn thoát khỏi Windows Sharing và chuyển sang cấu hình máy chủ phù hợp.

+0

Bạn có thể xem các tệp trong thư mục .hg/store/data trên máy chủ để xem liệu người dùng có quyền truy cập vào từng và mọi tệp của họ không? Khi bạn đẩy một tệp mới vào kho lưu trữ, siêu dữ liệu của nó được lưu trữ ở đó và bạn phải có quyền ghi vào các tệp này để có thể đẩy. – krtek

Trả lời

14

Anh ấy có thể thực hiện thêm một số thao tác đẩy và tiếp tục hoạt động như mong đợi. Sau đó tôi sao chép bản ghi nhớ vào máy của tôi, cập nhật một tệp và đẩy nó trở lại. Sau khi người dùng sau đó kéo các thay đổi của tôi và cố gắng đẩy trở lại máy chủ, anh lại một lần nữa gặp phải thông báo "Truy cập bị từ chối".

Có vẻ như thao tác đẩy của bạn sẽ tạo hoặc sửa đổi tệp trong thư mục .hg theo cách mà chúng (hoặc trở thành) không thể truy cập được đối với người dùng khác.

Tôi không có chuyên gia về quyền tệp NTFS, nhưng tôi nghĩ bạn có thể khắc phục các tình huống như vậy bằng cách buộc tất cả nội dung của thư mục kế thừa quyền của nó. Thử chọn "Thay thế tất cả các quyền đối tượng con bằng quyền thừa kế từ đối tượng này" trong cài đặt Bảo mật nâng cao của thư mục.

Tuy nhiên, việc chia sẻ tệp kho trực tiếp với chia sẻ tệp Windows là không được đề xuất. Bạn cần một quy trình máy chủ giữa người dùng và các tệp kho lưu trữ vì lợi ích của hiệu suất, tính toàn vẹn dữ liệu và bảo mật. Nếu không có gatekeeper như vậy, việc cấp quyền truy cập commit cũng có nghĩa là cấp khả năng hủy/hỏng các tệp kho lưu trữ (hoặc khi bạn phát hiện ra trong trường hợp này, thay đổi quyền của chúng).

Xem Publishing Mercurial Repositories trên wiki Mercurial để biết thêm thông tin về các tùy chọn khác.

+0

Tôi gợi ý cho cùng một vấn đề trong nhận xét của tôi. Và đề xuất sử dụng một loại máy chủ nào đó thực sự tốt! – krtek

+0

Đó chắc chắn là một vấn đề quyền. Cảm ơn vì tiền boa! – MutantXenu

0

Tôi đã nhận được chính xác thông báo lỗi tương tự khi cố gắng hg push tại dấu nhắc lệnh của cửa sổ. Gần đây tôi đã nhận được hồ sơ người dùng mới sau khi hồ sơ cũ đã bị hỏng. Sau đó tôi gặp phải lỗi này "Truy cập bị từ chối". Trong TortoiseHg, tôi đã nhận được một thông báo tương tự của "Bị hủy bỏ: Lỗi 255".

Tôi đã thử lời khuyên được cung cấp tại đây bởi Wim Coenen vì nó có vẻ phù hợp; được cấp bằng chứng xác thực người dùng mới của tôi. Cuối cùng, tôi đã theo dõi lỗi đến một Windows Git bị cài đặt sai. Nó chỉ thất bại khi tôi sử dụng kho với git sub-repos.

Trong trường hợp người khác đang gặp vấn đề tương tự với Git sub-Repos:

  • Kiểm tra xem Git được cài đặt đúng. Tôi đã xóa và cài đặt lại hoàn toàn. (Xem: https://code.google.com/p/msysgit/downloads/list cho phiên bản mới nhất).
  • Đảm bảo rằng đường dẫn đến Git nằm trong biến môi trường đường dẫn. (Nhấp chuột phải vào Máy tính của tôi -> tab Nâng cao -> Biến môi trường). Đừng quên rằng một số ứng dụng không thích cửa sổ đường dẫn với không gian để bạn có thể cần phải thay thế "Program Files" bằng "PROGRA ~ 1" (có thể là "PROGRA ~ 2" trên hệ thống 64 bit).
  • Nếu bạn đang sử dụng proxy, hãy đảm bảo rằng HTTP_PROXY và HTTPS_PROXY trong các biến môi trường cũng được đặt chính xác.
1

Khi cố gắng để thực hiện trên kho nhân bản tại địa phương của tôi về một repo mã trên mạng chia sẻ của tôi, tôi đã nhận được thông báo lỗi tương tự:

00manifest.i Access is denied 

Có lẽ quá đơn giản, nhưng loại bỏ một số các chỉ đọc quyền truy cập vào các tệp vi phạm đã khiến cho tác vụ của tôi bị phạt hg commit.

1

Tôi vừa gặp sự cố tương tự abort: Access is denied. Nguyên nhân là bức tường lửa (Privatefirewall) của tôi âm thầm chặn một số hành động của hg.

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