2010-06-28 15 views
14

Có rất nhiều trang web ở đó gợi ý hackish ways to make svn externals look like git submodules. Tôi đã đọc some accounts về những gì là sự khác biệt, nhưng điều này dường như không phải là rất cơ bản:Tại sao các mô-đun con git không tương thích với svn externals?

Git submodules liên kết đến một đặc biệt cam kết trong kho lưu trữ của một dự án khác, trong khi svn: externals luôn lấy phiên bản mới nhất.

Tại sao sự khác biệt này khiến chúng không tương thích về cơ bản? Không có một mặc định hợp lý chúng ta có thể giả định, chẳng hạn như hầu hết các svn: externals trỏ đến các thẻ không bao giờ di chuyển?

+0

Lưu ý rằng, như được nêu chi tiết trong http://stackoverflow.com/a/9189815/6309 và được đề cập trong câu trả lời được cập nhật của tôi bên dưới, một mô-đun con bây giờ có thể theo dõi chi nhánh mới nhất. – VonC

Trả lời

10

Sự khác biệt cơ bản là quy tắc thành phần .

Trong một sự thật dựa trên thành phần tiếp cận, bạn định nghĩa một configuration, đó là:
Danh sách các nhãn (của SHA1 cam kết cho Git), bạn cần cho dự án của bạn để "làm việc" (tức là "phát triển "," biên dịch "," triển khai ", ...).

Mỗi cam kết được tham chiếu trong cấu hình sẽ giúp bạn có được phiên bản chính xác của tất cả các cây. Không có ngoại lệ. Mỗi tệp của cây đó là phiên bản chính xác được chỉ định bởi cấu hình bạn đã xác định.


Lưu ý cho git1.8.2

"git submodule" bắt đầu học một chế độ mới để tích hợp với các đỉnh của chi nhánh từ xa (như trái ngược với việc tích hợp với các cam kết ghi trong gitlink của superproject) .

Vì vậy, sớm (tháng 3 năm 2013), một mô-đun con có thể tham chiếu đến HEAD ngược dòng và không chỉ là SHA1 cố định.


(Trước 1.8.2) Chỉ có thể có một nhãn/SHA1 cho mỗi mô-đun. Từ một repo cha mẹ phổ biến, bạn không thể định nghĩa một mô-đun trong một mô-đun.
(Tuy nhiên, một mô-đun, chỉ là tham chiếu đến một repo Git bên ngoài, có thể có định nghĩa submodules riêng của nó: repo chính sẽ chỉ tham chiếu submodule cấp đầu tiên, mà lần lượt sẽ tham chiếu bất kỳ submodules nó đã cam kết trong chính nó)


Không như vậy trong SVN external: bạn có thể xác định externals thư mục cũng như tập tin bên ngoài, có hoặc không có sửa đổi rõ ràng trong đó.
Bạn có thể soạn các thuộc tính bên ngoài khác nhau.Ví dụ:

$ svn propget svn:externals calc 
third-party/sounds    http://svn.example.com/repos/sounds 
third-party/skins -r148  http://svn.example.com/skinproj 
third-party/skins/toolkit -r21 http://svn.example.com/skin-maker 

Kết quả không phải là một cấu hình (một tài liệu tham khảo cho 'calc '), nhưng là một phần của quy tắc lựa chọn trong đó xác định 'chắp vá' chính xác mà bạn cần trong thư mục' calc'


Tóm lại, bạn không thể "tính toán" một SHA1 cho một mô-đun con 'calc' sẽ là số tương đương chính xác của một nhóm thuộc tính svn:external trên thư mục 'calc' SVN.

+0

Lưu ý về bản thân: ClearCase là một ví dụ khác của VCS cho phép bố cục trong cơ chế lựa chọn phiên bản của nó ... ngoại trừ nó đã trục xuất một chế độ như vậy với phương pháp UCM gần đây của nó: xem http://stackoverflow.com/questions/763099/flexible- vs-static-branching-git-vs-clear-precisionev/764219 # 764219 – VonC

+0

Được viết độc đáo. Nhưng ... Khi bạn kiểm tra SVN cha mẹ, cho dù các bên ngoài đã di chuyển hay không, bạn mong đợi nó để biên dịch và làm việc. Vì vậy, tôi sẽ không đủ, ít nhất là một mặc định, để băm mà sửa đổi cụ thể, khi bạn 'git svn clone' cha mẹ? –

+0

@Andres: làm thế nào bạn sẽ 'git svn dcommit' sau đó? Làm thế nào bạn sẽ đẩy lùi bất kỳ thay đổi nào bạn có thể đã thực hiện trong phần "submodule" của repo Git của bạn (xem "bản chất thực sự của submodules" http://stackoverflow.com/questions/1979167/git-submodule-update/1979194#1979194), mà thực sự tương ứng với một số repo SVN, một số người trong số họ với một phiên bản rõ ràng không phải di chuyển? – VonC

3

Nếu bạn sử dụng SmartGit để làm việc với kho SVN với svn: externalls, bạn sẽ không nhận thấy bất kỳ sự khác biệt thực sự nào.

Trên thực tế, sự khác biệt thực sự duy nhất (ít nhất là sự khác biệt kỹ thuật duy nhất) là SVN cho phép bên ngoài trỏ tới sửa đổi CHÍNH (không phải giá trị cố định), mô-đun con Git thì không. Tất cả những khác biệt khác là, theo ý kiến ​​của tôi, không đáng kể, vì vậy bạn hỏi đúng câu hỏi này.