Module Odoo là code — mà code thì phải có quản lý phiên bản. Nhưng versioning một module Odoo có vài điểm riêng: bỏ gì ra khỏi Git, đặt repo ở đâu cho khớp addons_path, đánh số version thế nào. Sau khi đã biết đọc code core, bài này dựng một quy trình Git gọn gàng cho chính module demo quan_ca_phe của loạt bài.
Repo đặt ở đâu?
Một repo Git thường bọc thư mục module (hoặc một thư mục chứa nhiều module). Điều quan trọng: thư mục chứa module đó phải nằm trong addons_path. Cấu trúc điển hình:

Hình 1: Bên trái là .gitignore chuẩn cho module Odoo; bên phải là cấu trúc repo. Chú ý .gitignore nằm ở gốc repo (ngoài thư mục module), và quy ước version manifest dạng 19.0.1.1.0 — hai số đầu là phiên bản Odoo, ba số sau là major.minor.patch của chính module.
.gitignore: thứ quan trọng nhất
Có hai loại file tuyệt đối không được commit:
- File sinh ra tự động —
__pycache__/,*.pyc. Chúng thay đổi liên tục, làm rác lịch sử và gây xung đột vô nghĩa. - File bí mật —
*.conf(odoo.conf chứa mật khẩu CSDL),.env. Commit nhầm là rò rỉ mật khẩu vào lịch sử Git, rất khó xoá sạch.
# Python
__pycache__/
*.py[cod]
.venv/
# Odoo
*.log
.idea/
.vscode/
# Bí mật — KHÔNG commit
*.conf
.env
Phiên làm việc Git thật
Tôi dựng một repo thật cho module quan_ca_phe, commit, rồi kiểm chứng .gitignore hoạt động:

Hình 2: Phiên Git thật. git status --short trả về trống — repo sạch, các file .pyc không hề xuất hiện. git ls-files cho thấy đúng 12 file mã nguồn được theo dõi. git check-ignore xác nhận file .pyc trong __pycache__ bị bỏ qua. Phần dưới là một nhánh tính năng: đổi version trong manifest, git diff hiện đúng một dòng thêm/bớt, rồi commit.
Quy ước thông điệp commit
Dùng tiền tố ngắn gọn (kiểu Conventional Commits) để lịch sử dễ đọc:
feat:— tính năng mới (thêm model, view, chức năng).fix:— sửa lỗi.chore:— việc lặt vặt (nâng version, cập nhật dữ liệu mẫu).refactor:— dọn code, không đổi hành vi.
git commit -m "feat: thêm trường điểm tích luỹ cho thẻ thành viên"
git commit -m "fix: sửa domain lọc thẻ hết hạn"
git commit -m "chore: nâng version module lên 19.0.1.1.0"
Nhánh tính năng
Đừng code thẳng trên main/master. Mỗi tính năng một nhánh, xong thì gộp (merge/PR):
git checkout -b feature/diem-tich-luy # tạo nhánh mới
# ... sửa code, test trên Odoo ...
git commit -am "feat: điểm tích luỹ"
git checkout master && git merge feature/diem-tich-luy
Lợi ích với Odoo: bạn thử nghiệm một tính năng (có thể phải -u module nhiều lần), nếu hỏng thì bỏ cả nhánh mà không đụng tới bản đang chạy.
Nâng version khi nào?
Đổi version trong __manifest__.py khi bạn muốn Odoo nâng cấp module lúc chạy -u. Odoo so version trong manifest với version đã cài trong bảng ir_module_module; khác nhau thì nó chạy các script nâng cấp/migration. Vì vậy mỗi thay đổi schema (thêm trường, đổi model) nên đi kèm bump version.
Nhớ ba ý
- Repo bọc thư mục module;
.gitignorelà thứ quan trọng nhất — bỏ__pycache__/*.pyc(rác) và*.conf/.env(bí mật, tránh rò rỉ mật khẩu). - Version manifest
19.0.x.y.z: hai số đầu là phiên bản Odoo; đổi version để Odoo chạy nâng cấp module khi-u. - Làm việc trên nhánh tính năng, commit theo tiền tố
feat/fix/chore— dễ thử nghiệm và bỏ đi mà không hại bản đang chạy.
Đã có repo gọn gàng, giờ ta cần cách dựng khung một module mới thật nhanh. Phần sau dùng lệnh odoo scaffold — tạo sẵn toàn bộ khung thư mục module chỉ bằng một dòng.