2010-03-03 23 views
22

Tôi đang đấu tranh về cách theo dõi chính xác kho lưu trữ lồng nhau bằng cách sử dụng TortoiseHg.Cách chính xác để xử lý kho lưu trữ lồng nhau Hg với Mercurial/TortoiseHg là gì?

Tôi có một kho lưu trữ chính theo dõi toàn bộ dự án của mình. Dự án này chứa một vài plugin nhỏ được lưu trữ bên trong một plugins/thư mục con.

Tôi rất muốn theo dõi từng plugin một cách độc lập (cam kết và đẩy vào BitBucket cho mỗi người) trong khi vẫn có thể thực hiện cam kết "toàn bộ" cho dự án của tôi, bao gồm các thay đổi được thực hiện cho plugin và đẩy nó vào một vị trí khác (không phải BitBucket).

Điều tôi đã làm từ trước đến nay là tạo một repo mới cho từng plugin của tôi. Tôi có thể cam kết và đẩy chúng vào BitBucket dễ dàng. Nhưng khi tôi đã cam kết kho lưu trữ "chính" của mình, TortoiseHg hiển thị thông báo lỗi nói rằng abort: path 'mainrepo\\plugins\\plugin1\\plugin1.php' is inside repo 'mainrepo\\plugins\\plugin1'.

Tôi có thể thấy rằng tôi đang làm điều gì đó sai, nhưng tôi không thể nói gì.

Tôi đang sử dụng một đêm của cả Mercurial và TortoiseHg (ToirtoiseHg phiên bản 0.9.3 + 237-ea50f793bbe4 và Mercurial-1.4.3 + 225-70dea42c9406) trên WinXP. Tôi đọc rằng xử lý subrepos đã được thêm vào xây dựng TortoiseHg này, nhưng, tốt, tôi thậm chí không chắc chắn subrepos là tính năng tôi phải sử dụng ở đây.

Cập nhật
Tôi đã thực hiện một số tiến bộ, nhưng vẫn không thể làm cho nó hoạt động theo cách mình muốn.
Dưới đây là cấu trúc của tôi:

-- .hg 
-- core 
-- app 
    -- file.php 
    -- file.css 
    -- plugins 
     -- plugin1 
      -- file1.php 
     -- plugin2 
      -- file2.php 

tôi đến ứng dụng/plugins, và nhân bản một plugin (tên plugin3) từ BitBucket đây. Sau đó tôi đã tạo một tệp .hgsub ở gốc và thêm app/plugins/plugin3 = app/plugins/plugin3 vào nó. Sau đó tôi có thể cam kết toàn bộ thư mục của mình.

Nhưng sau đó tôi đã cố gắng lấy phiên bản mới nhất của plugin1 từ BitBucket, vì vậy tôi đã chuyển đến ứng dụng/plugin, xóa plugin1/thư mục và nhân bản plugin1 từ BitBucket. Sau đó tôi thêm app/plugins/plugin1 = app/plugins/plugin1 vào .hgsub nhưng khi tôi cố gắng cam kết, tôi đã được chào đón với abort: path 'app/plugins/plugin1/file1.php' is inside repo 'app\\plugins\\plugin1'

Sự cố có vẻ như khi thư mục con của tôi giữ cùng tên với thư mục đã được Hg theo dõi trong thư mục/plugin.

Tôi đang làm gì sai? Tôi có nên thêm/chỉnh sửa nội dung nào đó đặc biệt trong plugin của tôi không?

Cập nhật
Cuối cùng tôi đã cố gắng làm cho nó hoạt động theo cách mình muốn.
Tôi đã phải "thủ công" để nói với Mercurial xóa các plugin/plugin1, plugins/plugin2 thư mục, cam kết thay đổi, sau đó sao chép lại plugin1 và plugin2 từ BitBucket, thêm app/plugins/plugin1 = app/plugins/plugin1 vào .hgsub và cam kết tất cả. Nó đã làm việc.
Bước quan trọng là cam kết sau khi xóa các thư mục plugin1/plugin2.

+0

Từ tài liệu, dòng có '.hgsub' là" Đường dẫn đầu tiên "là đường dẫn trong thư mục làm việc của chúng tôi và đường dẫn thứ hai là URL hoặc đường dẫn để kéo từ": vì vậy bạn không nên đặt ' ứng dụng/plugins/plugin3 = app/plugins/plugin3' nhưng 'app/plugins/plugin3 = url bitbucket cho plugin3'. Ditto cho plugin1 – VonC

+0

Tôi đã thử rằng, bằng cách sử dụng 'http: // bitbucket.org/username/plugin3 /', 'https: // tên người dùng @ bitbucket.org/username/plugin3 /' và thậm chí 'ssh: // hg @ bitbucket.org/username/plugin3' dưới dạng url nhưng vẫn có cùng thông báo hủy. Tôi đã alos đã thử trực tiếp từ dòng lệnh, và kết quả là như nhau. – pixelastic

+0

xin lỗi vì đã không trả lời nhận xét cuối cùng của bạn, nhưng trừ khi nhận xét của bạn bắt đầu bằng '@VonC', tôi sẽ không được thông báo. Xem http://blog.stackoverflow.com/2010/01/new-improved-comments-with-reply/ (phần "Comment @username Notifications") – VonC

Trả lời

18

Cuối cùng tôi đã cố gắng làm cho nó hoạt động theo cách tôi muốn. Tôi đang sử dụng TortoiseHg trên winXP, vì vậy tôi sẽ không thể cho bạn biết những gì các cuộc gọi hg được thực hiện trong nội bộ, nhưng tôi không nghĩ rằng bất cứ điều gì ưa thích được sử dụng ở đây.

Tôi bắt đầu với một repo hiện có, bên trong đó tôi có một thư mục plugins/ đầy plugin1/, plugin/2 thư mục (không phải kho, chỉ các thư mục đơn giản). Tôi cũng có các plugin trực tuyến, được lưu trữ trên BitBucket.

  • đầu tiên tôi đến thư mục plugins/ tôi, nhấp chuột phải vào plugin1/, TortoiseHg => Remove Files.
  • tôi nhận được trở lại vào thư mục gốc của repo của tôi, nhấp chuột phải và Hg Commit
  • Sau đó, tôi quay trở lại vào thư mục plugins/ tôi, nhấp chuột phải, TortoiseHg => Clone..., tôi chọn địa chỉ http của plugin trên chút xô (http://bitbucket.org/username/plugin1/ và nhấp Done
  • Mặt sau lại vào thư mục gốc của repo chính. tôi tạo ra (hoặc thay đổi nội dung nếu các tập tin đã tồn tại) một tập tin .hgsub và thêm dòng plugins/plugin1 = plugins/plugin1 bên trong nó.
  • tôi sau đó có thể hoặc là cam kết repo gốc chính hoặc plugin1 repo độc lập

Lưu ý rằng các bước bổ sung removecommit chỉ bắt buộc nếu repo mới được nhân bản có cùng tên của thư mục đã được theo dõi.

+0

@Pixelastic: cảm ơn bạn đã gửi phản hồi (+1) – VonC

+0

Ngọt ngào. Bạn đã trả lời một số câu hỏi mà tôi có. –

5

Bạn nên cố gắng sử dụng:

Subrepositories là một tính năng cho phép bạn xử lý một tập hợp các kho lưu trữ dưới dạng một nhóm.
Điều này sẽ cho phép bạn sao chép, cam kết, đẩy và kéo các dự án và các thư viện liên quan của họ thành một nhóm.

+0

Tôi có phải chỉnh sửa các tệp .hgsub theo cách thủ công hay TortoiseHg xử lý tất cả (thông qua việc kiểm tra một số tùy chọn)? – pixelastic

+0

@Pixelastic: cho TortoiseHg và subrepos, xem http: // stackoverflow.com/questions/2083393/mercurial-subrepos-how-do-you-create-them-và-how-do-họ-work – VonC

+0

@VonC: Cảm ơn, nhưng tôi đã đọc bài viết đó và tôi không muốn có các plugin của tôi trong một thư mục riêng biệt như ứng dụng chính của tôi, tôi muốn chúng như là các thư mục con. Tôi đã cập nhật câu hỏi chính với tiến độ của mình. Cảm ơn thời gian của bạn – pixelastic

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