Lưu ý: Câu hỏi của tôi tập trung vào vấn đề cụ thể của tôi (liên quan đến Liferay) nhưng tôi hy vọng nó có thể hữu ích cho bất kỳ ai cần duy trì các phiên bản khác nhau của cùng một dự án trên git.
Tôi làm việc cho một công ty viết rất nhiều plugin cho Liferay Portal . Các plugin này (portlets, theme, v.v.) thường có thể tái sử dụng và tất nhiên, nên được cập nhật cho các phiên bản mới của cổng thông tin.
Tuy nhiên, thông thường phải di chuyển, giả sử, một portlet sang phiên bản mới của Liferay và để duy trì phiên bản trước đó. Ngoài ra, thường xuyên, chúng tôi phải tạo các tùy chỉnh rất cụ thể cho một số khách hàng, điều này không có nghĩa là được thêm vào "phiên bản chính".
Những điều cần thiết làm phức tạp công việc của chúng tôi, nhưng may mắn thay, chúng tôi có thể giả định một số đơn giản hóa. Ví dụ, các plugin được cập nhật thường xuyên bởi chỉ một lập trình viên tại một thời điểm. Rất hiếm khi có hai hoặc nhiều tính năng được thêm vào một plugin cùng một lúc.
Bây giờ, chúng tôi đang di chuyển đến Gitorious . Chúng tôi đang cố gắng hình thành một mô hình phân nhánh cho một kịch bản như vậy.
Mô hình của tôi
Những gì tôi đề xuất là:
- Mỗi plugin sẽ có kho lưu trữ riêng trong Gitorious bên trong một dự án. Ví dụ, một portlet để hiển thị mèo con sẽ có một
kittens-portlet
kho lưu trữ bên trongliferay-portlets
dự án. - Khi tạo một plugin mới, hãy tạo nó tại một nhánh có tên theo phiên bản Liferay (ví dụ
lf5.2
:). - Mỗi lần cập nhật được thực hiện trên các plugin, bản cập nhật được phê duyệt và triển khai trong sản xuất, thẻ plugin với một phiên bản (ví dụ
lf5.2v1
,lf5.2v2
vv.) * - Mỗi khi plugin được chuyển sang phiên bản mới của Liferay, chúng tôi sẽ phân nhánh phiên bản mới nhất (ví dụ: tạo chi nhánh
lf6.0
). - Sau khi sản xuất, người đứng đầu chi nhánh mới sẽ nhận được một thẻ như
lf6.0v1
. - Mỗi lần chúng tôi phải tùy chỉnh plugin theo cách dành riêng cho khách hàng, chúng tôi sẽ tạo một chi nhánh với tên của khách hàng (ví dụ: chúng tôi sẽ tạo một chi nhánh
lf5.2clientcorp
cho khách hàng của mình "ClientCorp Inc.")
Đây là một mô hình bất thường: nó sẽ không có master
và rất nhiều chi nhánh không hợp nhất. Đây là cách tôi cho rằng một kho lưu trữ với mô hình như vậy sẽ như thế nào:
Một người bạn thấy hệ thống này khá phức tạp và dễ bị lỗi. Ông đề xuất mô hình Vincent Driessen xuất sắc và nổi tiếng , điều mà tôi thấy vẫn khó quản lý và đòi hỏi kỷ luật hơn. Nó là tuyệt vời (và đã được thử nghiệm!) Tất nhiên nhưng dường như quá phức tạp với tình hình của chúng tôi.
Người mẫu của bạn tôi
Sau đó, ông đề xuất một mô hình khác: chúng tôi sẽ có một kho lưu trữ cho mỗi plugin trong phiên bản Liferay (vì vậy chúng tôi sẽ bắt đầu tạo một kittens-lf5.2-portlet
và sau đó a kittens-lf6.0-portlet
), mỗi cái có một master
nhánh và một develop
nhánh. Các master
sẽ luôn sẵn sàng để triển khai. (Hoặc nó có thể là cách khác, master
và stable
, như đề xuất của Steve Losh ).
Điều này rất đơn giản, nhưng tôi không thích hệ thống này:
- nó có thể dẫn đến rất nhiều kho lưu trữ trong một dự án, khiến Gitorious khó duyệt.
- Tên của thư mục của dự án có liên quan. Nếu ai đó sao chép kho lưu trữ vào một
kittens-lf6.0-portlet
thư mục và tạo WAR bằng ant (như thường lệ), tên WAR cũng sẽkittens-lf6.0-portlet
như vậy. Các phiên bản cũ của portlet này (kittens-portlet
ví dụ được đặt tên ) sẽ được coi là các portlet khác nhau (và có thể bị thiếu) trong một cổng thông tin được nâng cấp. Một chút quan tâm có thể tránh nó nhưng tôi muốn tránh nó. - Các phiên bản khác nhau của cùng một plugin sẽ được duy trì tách biệt. Tôi tan nát trái tim :(
kittens-lf6.0-portlet
là một cái tên xấu xí cho một kho lưu trữ, tôi nghĩ vậy.
Tôi nghi ngờ hai điểm cuối cùng - cũng là hai điểm chủ quan hơn - là lý do chính cho sự không sẵn lòng của tôi. Tuy nhiên, tất cả bốn phản đối đứng.
OTOH, đề xuất của riêng tôi có vẻ lạ đối với bản thân tôi và tôi tự hỏi liệu có lỗi ẩn trên đó không. OT3rdH git mạnh mẽ và linh hoạt đến mức tôi nghĩ rằng tôi không cảm thấy xấu hổ khi khám phá những khả năng của nó.
Vì vậy tôi hỏi:
- Điều gì sẽ là mô hình tốt nhất? Đề nghị của tôi? Mô hình của bạn tôi? Hệ thống Vincent Driessen truyền thống hiện nay?
- Những mô hình phân nhánh khác mà bạn sẽ đề nghị?
- Nếu bạn nghĩ rằng mô hình của tôi là xấu, tại sao bạn nghĩ như vậy? Tôi rất thích tìm hiểu những nhược điểm và điểm mù.
* Trên thực tế, tôi thích gắn thẻ cam kết với một phiên bản, v1
nhưng rõ ràng thẻ trong git không nằm trong nhánh - nghĩa là tôi không thể có v1
thẻ 1 lf5.2
và một thẻ khác trong lf6.0
- vì vậy tôi phải đặt tên cho chi nhánh. Có đúng BTW không?