Câu hỏi này hỏi về sao chép minh bạch , và tôi nghi ngờ vẫn chưa có câu trả lời nào vì mọi người có thể đang bị treo lên vì sự minh bạch. Tôi sẽ tự do đặt sự minh bạch sang một bên để tập trung vào việc nhân rộng. Tôi sẽ giải quyết (hoặc phạt) sự minh bạch sau này và trên thực tế tôi không thực sự nghĩ rằng đó là tất cả những gì quan trọng trong DVCS.
Trước tiên, hãy để tôi chạy xuống một vài điểm chính về cách thức hoạt động của kho lưu trữ trong DVCS. (Tôi quen thuộc nhất với Mercurial, vì vậy đó là những gì tôi sẽ sử dụng làm ví dụ, nhưng tôi tin rằng mọi điều tôi nói cũng đúng với git.)
A. Trong một DVCS, bất kỳ bản sao nào cũng chứa nội dung và lịch sử tệp giống như bản gốc.
Cung cấp cho bạn giữ các repos đúng cách đồng bộ, điều này có nghĩa là bạn có thể sử dụng các hoạt động lan truyền thay đổi DVCS thông thường (nhân bản, đẩy, kéo) và các repos thông thường để xây dựng một hệ thống sao chép.
B. Những thay đổi mới không phải được truyền bá đến nơi chúng đến.
Đặc biệt, nếu tôi nhận được các thay đổi từ một repo cụ thể và thêm một số thay đổi của riêng tôi, các thay đổi của tôi không phải quay lại repo cụ thể đó. Họ có thể đi nơi khác. Tiện ích này sẽ trở nên rõ ràng từ các ví dụ tôi sẽ trình bày bên dưới.
C. Thay đổi có thể được truyền qua đẩy hoặc kéo.
Trong một hệ thống tập trung, những thay đổi mới có thể khá nhiều (tôi nghĩ) chỉ được đẩy vào repo. Trong một DVCS, có thể thiết lập một loạt các cấu trúc liên kết lan truyền thay đổi, một số trong đó chỉ liên quan đến việc kéo. Điều này cho phép linh hoạt hơn trong việc thiết lập.
Ví dụ
Để thảo luận, giả sử các nhóm phân phối của bạn sử dụng các hệ thống trong các miền duke.de, duke.us, duke.cn và duke.mx, và hơn nữa rằng duke.de là nơi chúng tôi muốn có repo "may mắn". Với các giả định này, hãy để tôi đưa ra một số ví dụ về các cấu trúc liên kết khác nhau mà bạn có thể thiết lập, ghi nhớ ba điểm DVCS chính ở trên.
0. Mô hình đẩy tập trung
Có một repo duy nhất tại hg.duke.de và có các nhà phát triển ở tất cả các vị trí nhân bản và kéo từ đây và đẩy các thay đổi ở đây. Điều này có thể làm việc cho những người ở Đức, nhưng nó có thể là một vấn đề cho người dân trên toàn thế giới. Tất cả các hoạt động nhân bản, kéo và đẩy sẽ đi qua các liên kết mạng đường dài chậm. Điều này đang sử dụng DVCS giống như một hệ thống tập trung. Đây là vấn đề bạn đang cố gắng giải quyết.
1. Đẩy tập trung với nhân rộng
Có repo may mắn tại hg.duke.de và có bản sao tại hg.duke.cn, hg.duke.mx và hg.duke.us. Các nhà phát triển đã sao chép từ bản sao cục bộ của họ và đẩy các thay đổi sang hg.duke.de. Bất cứ khi nào những thay đổi mới xuất hiện trong hg.duke.de, một hook sẽ truyền chúng đến các bản sao. Các bản sao chỉ đọc, do đó sẽ không bao giờ có bất kỳ sự hợp nhất hoặc xung đột nào.
Ví dụ: nếu tôi là nhà phát triển ở Mexico, tôi sẽ sao chép từ hg.duke.mx nhưng đẩy các thay đổi thành hg.duke.de. Nếu các thay đổi khác được đẩy vào hg.duke.de trước khi tôi có thể đẩy các thay đổi của mình, việc đẩy của tôi sẽ bị chặn. Các thay đổi khác sẽ được sao chép thành hg.duke.mx, vì vậy tôi sẽ kéo các thay đổi này cục bộ, hợp nhất và sau đó thử đẩy sang hg.duke.de một lần nữa.
Điều này sẽ cung cấp một số lợi thế, vì các hoạt động nhân bản lớn đều được thực hiện tại địa phương. Đẩy vào repo trung tâm ở một vị trí khác có thể không quá tệ, vì các thay đổi được đẩy tương đối không thường xuyên, thay đổi gia tăng thường khá nhỏ. (Đặc biệt Mercurial gửi các khác biệt được nén, không phải toàn bộ tệp và lịch sử của chúng.)
Trong Mercurial, bạn có thể thiết lập một repo cục bộ để kéo từ một vị trí và đẩy đến một vị trí khác bằng cách đặt một cái gì đó như sau vào .hg/hgrc
tệp:
[paths]
default = ssh://hg.duke.mx
default-push = ssh://hg.duke.de
2. Mô hình kéo đơn giản
Tiếp tục với hg.duke.de là repo may mắn và những người khác là bản sao, chúng ta có thể tuyên truyền các thay đổi thông qua kéo thay vì đẩy. Các nhà phát triển nhân bản và lấy từ bản sao địa phương của họ như bình thường. Khi một thay đổi đã sẵn sàng, một nhà phát triển gửi yêu cầu kéo đến một số dịch vụ trung tâm, kéo từ repo của nhà phát triển vào hg.duke.de. Một chính sách sẽ cần phải được thiết lập để sáp nhập. Ví dụ: nếu có xung đột hợp nhất, yêu cầu có thể bị từ chối, yêu cầu nhà phát triển phải kéo (từ bản sao cục bộ), hợp nhất và gửi lại yêu cầu kéo.
Cách tiếp cận này có ưu điểm là không khiến nhà phát triển chờ đợi trong khi các thay đổi đang được tuyên truyền. Tất nhiên, nhà phát triển vẫn phải chờ yêu cầu kéo được thực hiện, nhưng ít nhất anh ta hoặc cô ta có thể làm việc với những thay đổi bổ sung trong thời gian đó.
Biến thể
Có một loạt các biến thể có thể được áp dụng.
Việc gửi yêu cầu kéo là một thời gian hoàn hảo để xem xét mã. Các thay đổi được công bố, theo nghĩa là chúng có sẵn cho tất cả mọi người, nhưng chúng chưa được tích hợp vào repo may mắn.
Yêu cầu kéo có thể được thực hiện theo cách thủ công hoặc bởi một số hệ thống tự động. Xử lý một yêu cầu kéo có thể không hợp nhất các thay đổi trực tiếp vào repo may mắn, mà thay vào đó là một khu vực tổ chức tạm thời, nơi chu trình xây dựng và thử nghiệm được thực hiện. Chỉ sau khi vượt qua tất cả các bài kiểm tra, bộ thay đổi mới được tích hợp vào repo may mắn.
Những người thoải mái hơn với mô hình đẩy có thể muốn thiết lập repo dàn địa phương ở mỗi vị trí, bên cạnh bản sao, ví dụ: hg-stage.duke.mx, hg-stage.duke.cn, v.v. Điều này đòi hỏi nhiều công việc hơn một chút, mặc dù, vì các nhà phát triển không chỉ phải hợp nhất với các thay đổi cục bộ khác, mà ai đó phải chịu trách nhiệm hợp nhất các thay đổi từ các repos dàn dựng vào repo may mắn. Điều này có thể làm việc trong các trường hợp phù hợp, mặc dù, và có thể được hỗ trợ bởi tự động hóa.
"Minh bạch"
Bây giờ đến vấn đề nhân rộng minh bạch.
Với các kịch bản trên, tôi không thực sự thấy sự cần thiết phải sao chép minh bạch. Tất cả các repos đều có thể nhìn thấy cho mọi người, và có những quy ước để kéo / nhân bản từ bản sao địa phương và đẩy đến một repo may mắn hoặc khu vực tổ chức địa phương.
Nếu bạn muốn minh bạch, bạn có thể yêu cầu mọi người thiết lập miền tìm kiếm DNS theo vị trí của họ. Bản sao cục bộ và repos dàn dựng đơn giản sẽ được gọi là "hg" và "hg-giai đoạn" và thiết lập DNS sẽ giải quyết những điều này cho hg.duke.cn và hg-stage.duke.cn cho các nhà phát triển ở Trung Quốc và tương ứng cho nhà phát triển ở các địa điểm khác. Nhưng đây là một chút ma thuật và có thể gây nhầm lẫn, và tôi thực sự không nghĩ rằng nó bổ sung nhiều.
Tôi mong bạn trả lời câu hỏi này. Tôi đã nhận được một số quyền tự do với câu trả lời, nhưng dường như với tôi rằng tình huống của bạn có thể được khắc phục thông qua việc sử dụng các kỹ thuật mà tôi đã mô tả ở trên.