Cách tổ chức, phân nhánh trong TBS ==================================
TBS là tập hợp các chỉ thị biên dịch (PKGBUILD) cho tất cả các gói được hỗ trợ (chính thức hoặc một phần) bởi TheSLinux. Đây là một kho git, với một số nhánh đặc biệt: TheBigBang, TheSmallBang, _utils, và các nhánh cho từng gói. * _utils: nhánh chứa các công cụ, miếng vá cấn thiết cho TBS * TheBigBang: đây là nhánh khởi đầu cho mỗi gói mới. Nghĩa là, khi tạo ra một gói mới, thì sẽ tạo ra nhánh mới bắt đầu từ nó. TheSmallBang là một cách khác, do nó có chứa các quy tắc đơn giản hơn, trong khi TheBigBang thì dài dòng, không được khuyến cáo dùng Mỗi gói trong TBS được bố trí trong một nhánh riêng trong kho git. Ví dụ, với gói `pidgin`, thì * Chỉ thị biên dịch cho gói này nằm trên nhánh `pidgin` [4] * Các tập tin liên quan nằm trong thư mục '/pidgin/' [4] Mục đích của việc đặt thư mục riêng, là để khi thực hiện trộn tất cả các nhánh vào `master` thì mỗi gói sẽ nằm riêng một thư mục, không gói nào ảnh hưởng tới gói nào. Mặc dù vậy, việc "trộn" này chỉ được xét tới về mặt lý thuyết, trong thực tế sẽ không thực hiện như vậy (đọc tiếp). Trộn các nhánh thế nào ====================== Do mỗi gói nằm trên một nhánh, nên sẽ xuất hiện rất nhiều nhánh trong kho git. Hiện giờ, con số này là hơn 800 nhánh. Nếu đã quen với việc dùng git (với các workflow của nó), bạn sẽ ngạc nhiên với số lượng lớn nhánh như vậy thì việc "trộn" (merge) sẽ như thế nào, làm sao quản lý hết? Okay, trong TheSmallBang [2], có quy tắc (thứ ba), là sẽ không bao giờ thực hiện trộn hai nhánh với nhau (đọc tiếp), đặc biệt nếu hai nhánh dành cho hai gói khác nhau. Nghĩa là, "việc sử dụng các nhánh git là để làm cho các chỉ thị biên dịch (PKGBUILD) có một số điểm chung tiện lợi cho sau này, không phải để merge như git workflow thông thường". Việc đặt chung các nhánh (gói) vào cùng một kho này coi có vẻ phức tạp, nhưng tính ra sẽ đơn giản hơn so với việc dùng mỗi gói một repo riêng. (Không so sánh với Subversion, chuyện dài kể sau.) Feature branch cho mỗi gói ========================== Okay, vậy thì "git workflow" với pull-request thông thường được thực hiện thế nào? Trước khi tiếp tục, xin bạn nhớ trong TBS sẽ dùng hai khái niệm nhánh khác nhau * Package branch: Ví dụ nhánh dành cho pidgin [4] vừa nói trên * Feature branch: đây chính là cái bạn vừa hỏi (đọc tiếp). Ví dụ, (một vấn đề phổ biến) là khi bạn muốn biên dịch lại gói `pidgin` với các cấu hình do bạn tùy chọn (chẳng hạn, để bỏ đi các protocol không cần thiết như MSN, hoặc để thêm sẵn vài plugin bạn cần.) Để làm điều này, bạn sẽ tạo (fork) ra một nhánh riêng, bắt nguồn từ nhánh gốc "pidgin", ví dụ, $ git checkout pidgin $ git clone -b pidgin@my-crazy-features Có gì đặc biệt? Nhánh này có tên đặt theo tiêu chuẩn riêng, gồm 3 phần: * tên gốc: pidgin (có thể dùng p_pidgin) * chỉ thị rẽ nhánh: @ (có thể dùng #, %, ...) * tên feature: my-crazy-features Hệ thống TBS sẽ nhận biết được cách đặt tên này, và sẽ tự động đánh số, lựa chọn thẻ, lựa chọn chỉ số biên dịch (package rel, [1]) một cách tự động. Mặc khác, vì hai nhánh "pidgin" và "pidgin@...." chia sẻ cùng phần gốc "pidgin", nên có thể trộn với nhau. Đây chính là chỗ "git workflow" thông thường. Nói thêm, "@" được dùng khi gói mới sinh ra gói "conflict" hoặc thay thế hoàn toàn gói cũ (pidgin), còn "%" nếu gói mới có thể cài đặt song song với gói gốc (pidgin) [hoặc ít ra không gây xáo trộn lớn]. Khi dùng "@" hoặc "%" thì TBS sẽ tự động tính toán các phần phụ thuộc này. Nếu bạn muốn điều chỉnh bằng tay, dùng "=" Ví dụ về feature branch ======================= Ví dụ: Xem [5]: Trong gói `pacman`, phần kịch bản tạo gói `makepkg` có thể được tạo ra cực kỳ nhanh, không cần phải qua quá trình biên dịch bất kỳ mã nguồn C nào. Trong quá trình phát triển, nếu phải thay đổi thường xuyên kịch bản `makepkg` mà mỗi lần phải biên dịch lại toàn bộ gói `pacman` thì thật hoang phí. Vì thế, chỉ việc tạo ra một "feature branch" `pacman%makepkg`, mà chỉ thị biên dịch chính được cho trong kịch bản "thứ cấp" PKGBUILD%makepkg [6] (hãy đọc qua trước khi đọc tiếp bài này.) Như bạn thấy, TBS còn nhận diện chỉ thị biên dịch PKGBUILD%makepkg một khi tập tin này tồn tại: Đọc nội dung PKGBUILD Đang làm việc trên "feature branch" ? Có => Đọc tập tin PKGBUILD [feature] nếu có; tiếp tục [G] Không => tiếp tục [G] G: (biên dịch gói) Còn nhiều thứ để nói nữa. Nhưng tạm vậy, bạn đã mệt rồi! Các liên kết ============ [3] TBS: https://github.com/TheSLinux/buildsystem [4] TBS @ pidgin: https://github.com/TheSLinux/buildsystem/tree/pidgin [5] pacman%makepkg: https://github.com/TheSLinux/buildsystem/tree/pacman%25makepkg [6] PKGBUILD%makepkg: https://github.com/TheSLinux/buildsystem/blob/pacman%25makepkg/pacman/PKGBUILD%25makepkg -- I am ... 5.5 dog years old. -- To ubsubscribe from the list hackers@lists.theslinux.org, please send an email to ecar...@lists.theslinux.org with subject ubsubscribe hackers To get basic commands to use Ecartis system, use subject 'help'.