2009-07-10 33 views
6

Giả sử bạn có bốn sản phẩm đều có lịch phát hành riêng. Mỗi sản phẩm có 50% mã chia sẻ (chức năng phổ biến trên tất cả các sản phẩm) và 50% mã sản phẩm cụ thể.Kiểm soát nguồn - Là một nhánh riêng biệt cần thiết cho mỗi sản phẩm?

Bạn có cần một nhánh kiểm soát nguồn riêng biệt cho từng sản phẩm không? Các chức năng thông thường có nên được phát triển ở một trong bốn ngành sản phẩm và sáp nhập với các sản phẩm khác sau này không?

Trường hợp điển hình: Sản phẩm A được phát hành vào tháng tới và yêu cầu nâng cấp lõi (chia sẻ) 1, sản phẩm B được phát hành trong bốn tháng và yêu cầu nâng cấp lõi (được chia sẻ) 2 (sẽ mất ba tháng để hoàn thành).

+0

Để làm rõ. Cách ly mã là điều cần thiết. Tôi không muốn thực hiện thay đổi đối với sản phẩm B đang được phát hành vào năm 2011, sản phẩm này sẽ được giải phóng vào ngày mai. Tuy nhiên tôi không muốn chia sẻ mã chia sẻ và duy trì hai bản sao riêng biệt mãi mãi, mã được chia sẻ cần phải được chia sẻ.Khi một sản phẩm được cung cấp mã chia sẻ 'mới nhất', sản phẩm cần phải được kiểm tra lại trước khi phát hành. Dựa trên thông tin này - các nhánh sẽ được tạo và duy trì như thế nào? –

+0

@Ben Breen - Với làm rõ của bạn, tôi vẫn đề nghị sử dụng svn: externals. Sản phẩm A có thể thay đổi Lõi, nhưng bạn có thể kiểm soát khi những thay đổi đó quay trở lại/lõi/thân phụ thuộc vào lịch phát hành Sản phẩm B. Nếu bạn đang thực hiện thay đổi đối với Core chỉ cho Sản phẩm A, thì có lẽ mã đó không nên nằm trong lõi. –

Trả lời

1

Đây là IMO một trong những điều tốt nhất mà tôi đã đọc về phân nhánh: Branching and merging in the face of agile development, extreme programming, team collaboration, and parallel releases

Tôi nghĩ rằng tôi muốn để tránh khớp nối các chi nhánh (và do đó tiến độ) của hai dự án: và vì vậy, thay vì một chi nhánh duy nhất trong đó bạn đang chỉnh sửa chức năng phổ biến và chỉnh sửa nhiều hơn một sản phẩm, có lẽ một trong hai phương thức sau:

1) Xây dựng các chức năng phổ biến một cách độc lập của bất kỳ sản phẩm

  • Chi nhánh chung chức năng
  • Thêm vào đó
  • Đơn vị kiểm tra nó
  • Commit nó trở lại vào
  • chi nhánh sản phẩm cụ thể
  • Make đường chính của nó (Mainline) và sử dụng nó trong các sản phẩm

2) Phát triển các chức năng thông thường với một sản phẩm

  • Thực hiện một chi nhánh sản phẩm
  • trong ngành sản phẩm, thêm chức năng mới vào thư viện chung cũng như các thành phần dành riêng cho sản phẩm
  • Kiểm tra đơn vị và kiểm tra hệ thống và cam kết trở lại vào đường chính
  • Tạo các nhánh của đường chính mới mà bạn sử dụng mới chức năng phổ biến được cam kết trong các sản phẩm khác
0

Đặt tất cả trong một chi nhánh. Bạn muốn biết tại thời điểm phát triển nếu một sự thay đổi trong sản phẩm A phá vỡ sản phẩm B. Điều này là tốt hơn nhiều so với việc kết hợp một mớ hỗn độn khi bạn phát hiện ra rằng ProductB phải viết lại một nửa bộ mã nguồn phổ biến của bạn.

EDIT: Để làm rõ, tôi có nghĩa là tất cả họ nên chia sẻ một chi nhánh phát triển. Tôi sẽ tư vấn cho một chi nhánh sản xuất riêng để đại diện cho mã đang được sản xuất và chi nhánh bảo trì nếu bạn phát hành bản sửa lỗi thường xuyên.

+1

Tôi không đồng ý: bởi vì thực hiện điều đó yêu cầu bạn hoàn thành việc thay đổi sản phẩm A và sản phẩm B trước khi bạn có thể cam kết một chi nhánh duy nhất bao gồm các thay đổi cho cả hai sản phẩm. Thay vào đó, bạn có thể muốn có thể cam kết/giải phóng một sản phẩm trước khi một sản phẩm khác hoàn thành, IMO ngụ ý có nhiều hơn một chi nhánh. – ChrisW

+0

Sự cân bằng ở đó, sau đó, là một sự tách biệt lớn hơn nhiều giữa các dự án của bạn, mà có thể (và lịch sử, có) dẫn đến một mớ hỗn độn xấu xí lớn khi bạn cố gắng hợp nhất chúng. –

1

Không phải là câu trả lời trực tiếp cho câu hỏi của bạn, bởi vì tôi không chắc chắn 100% có một câu trả lời "một kích thước phù hợp với tất cả" có thể được đưa ra. Nhưng Jeff đã viết một số tuyệt vời blog post around branching.

+0

-1 Tôi đọc câu hỏi về mã chia sẻ, không quá nhiều về phân nhánh và hợp nhất. –

2

Chức năng phổ biến có thể được phát triển trong một nhánh nền tảng riêng biệt, với mỗi sản phẩm nhận được chi nhánh riêng để phát triển sản phẩm cụ thể.

+0

Điều đó không trả lời câu hỏi, IMO: đó là về việc liệu, khi nào và cách các nhánh khác nhau tương tác với nhau như thế nào. – ChrisW

3

Tôi giữ mã được chia sẻ trong thư mục sản phẩm của chính nó. Sau đó, sử dụng svn:externals để chia sẻ mã giữa các sản phẩm khác. Đó là hơi đau đớn để xử lý phân nhánh và sáp nhập, nhưng nó tốt hơn so với việc có bốn bản sao của mã được chia sẻ trong kho lưu trữ. Một cái gì đó như thế này (thay thế thân với /branches/RB-1.0.0 hoặc /tags/REL-1.0.0 cho ngành phát hành và được gắn thẻ phát hành):

/core/trunk 
/product_a/trunk 
    /core (svn:externals 'core /core/trunk') 
/product_b/trunk 
    /core (svn:externals 'core /core/trunk') 
/product_c/trunk 
    /core (svn:externals 'core /core/trunk') 
/product_d/trunk 
    /core (svn:externals 'core /core/trunk') 

UPDATE0: Lưu ý rằng/PRODUCT_A/thẻ/REL-1.0.0 có thể sử dụng /core/tags/REL-1.0.0 trong khi /product_b/tags/REL-1.0.0 có thể sử dụng /core/tags/REL-1.1.0

+0

Nhưng nếu bạn chuẩn bị phát hành một sản phẩm và kiểm tra thay đổi mã chia sẻ sẽ phá vỡ nó? –

+0

@Ben Breen - Nhánh phát hành cho Sản phẩm A nên sử dụng nhánh phát hành cho Core. Đừng phá vỡ nhánh phát hành. Trong thời gian đó, các sản phẩm B, C, D sẽ sử dụng Lõi chính cho đến khi chúng sẵn sàng để giải phóng, và một nhánh phát hành mới cho sản phẩm được cấp phép và Core được tạo ra. –

0

Chúng tôi có kịch bản tương tự. Chúng tôi có các thư viện chung để ghi nhật ký, truy cập dữ liệu và bảo mật nhưng các thư viện này được sử dụng trên nhiều dự án. Những gì chúng tôi làm là tạo ra một bộ riêng biệt của các chi nhánh cho mỗi sản phẩm và sau đó sử dụng SVN externals để liên kết với các thư viện phổ biến. Vì vậy, các thư viện chung được duy trì trong một nhánh "được chia sẻ" trên tất cả các dự án, trong khi tất cả các dự án đều có các nhánh độc lập.

Bằng cách này, chúng tôi có thể đảm bảo rằng tất cả các sản phẩm đang xây dựng dựa trên phiên bản mới nhất của các thư viện chung, trong khi các dự án cũng có thể duy trì độc lập.

0

Chúng tôi đã xây dựng một loạt các trang web có cơ sở chung và một lượng lớn mã tùy chỉnh sử dụng git bằng cách cấu trúc nó dưới dạng một loạt các nhánh.

Chi nhánh chính chứa mã lõi và mỗi chi nhánh của chủ đó là một tùy chỉnh cụ thể của lõi. Khi thực hiện thay đổi cho lõi, thật dễ dàng đẩy chúng xuống các nhánh, trong khi vẫn giữ riêng từng phiên bản tùy chỉnh.

18 trang web và dự án 12 tháng với nhóm 7 người và nó vẫn được kiểm soát tốt!

+0

Giống như nó - điều này cung cấp cách ly mã chính hãng. Nhưng tại sao lại đặt mã lõi vào một nhánh riêng biệt. Bạn không muốn nhìn thấy nó trong sử dụng một nơi nào đó, và do đó phải phát triển nó trên một sản phẩm? –

+0

Không - cốt lõi không phải là sản phẩm sản xuất - chỉ là nền tảng cho các ứng dụng tùy chỉnh. Đây không phải là một hạn chế của phương pháp này, chỉ là một trong những dự án. Không có lý do gì khiến bạn không thể biến master thành một sản phẩm có thể tái phát. – Codebeef

+0

Thực ra tôi nhận ra điều này không làm việc cho chúng tôi. Chúng tôi có thể nhận được yêu cầu trong sản phẩm A được phát hành trong tháng này yêu cầu nâng cao chức năng cốt lõi 1. Sản phẩm B được phát hành trong bốn tháng yêu cầu chức năng lõi 2 (sẽ mất ba tháng để hoàn thành). –

1

Chi nhánh tại điểm cao nhất có thể trong cây của bạn. IE, nó nên bao gồm mã cho tất cả các dự án của bạn, mô-đun được chia sẻ ... và có thể là những thứ như tài liệu/xây dựng kịch bản/trình cài đặt/v.v. Tại sao? Tại sao không! Các chi nhánh có giá rẻ trong tất cả các hệ thống được đề cập cho đến nay (SVN, TFS, Perforce, git).

Chiến thuật này đặc biệt quan trọng trong các hệ thống sử dụng phân nhánh "không gian đường dẫn" (TFS, Perforce). Nếu không, tạo một bản dựng bộ sản phẩm hoàn chỉnh phù hợp với không gian làm việc của những người khác nhau sẽ trở thành cơn ác mộng bảo trì.

Khi bạn đã đưa điều này vào thực tế, bạn được tự do sửa đổi càng nhiều hoặc ít phần mã theo ý muốn của bạn trong một nhánh cụ thể. Bạn luôn có thể thực hiện một bản dựng đầy đủ để xác minh các vấn đề tích hợp; tùy chọn hợp nhất bất kỳ thành phần nào giữa bất kỳ nhóm chi nhánh nào vẫn mở cho bạn. Nhưng câu hỏi của Chiến lược SDLC hoàn toàn trực giao. Bạn có thể phân nhánh cho mỗi tính năng, mỗi nhóm, mỗi lần phát hành hoặc bất kỳ kết hợp nào ở trên; * Thực tế là mỗi chi nhánh xảy ra là một superset chứng minh thuận lợi trong nhiều chiến lược, và không bao giờ nên là một con miễn là các công cụ của bạn là đến thách thức.

* Chọn chiến lược là một vấn đề riêng lẻ phụ thuộc vào nhiều yếu tố. Những người khác đã đề xuất một số tài liệu nổi tiếng giúp bạn quyết định. Tôi sẽ đưa bản sửa đổi mới nhất của Microsoft's TFS guidance lên đó với bản sửa đổi tốt nhất của chúng.

+0

Thật vậy. Nó sẽ là tuyệt vời nếu ai đó có thể đề xuất một chiến lược hợp lý đáp ứng các yêu cầu. Tôi luôn luôn tự hỏi nếu phân nhánh cho mỗi tính năng là thực hành tốt hay đưa một khái niệm đến thái cực điên rồ. –

+0

Tôi chắc chắn đồng ý với * nơi * bạn chi nhánh. Câu hỏi khó là IMO là * khi * bạn chi nhánh, bao nhiêu chi nhánh, loại thay đổi trong mỗi nhánh (tức là mục đích của mỗi nhánh) và cách (ví dụ: trong chuỗi nào) để cập nhật và/hợp nhất các nhánh/thay đổi. – ChrisW

+1

Ben: cho những gì bạn đã nói cho đến nay, tôi sẽ đề xuất tối thiểu 1 chi nhánh cho mỗi sản phẩm. Bạn muốn nhiều hơn nếu cô lập môi trường thử nghiệm với các môi trường thử nghiệm là mong muốn, hoặc các nhóm rất lớn. –

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