Cơn ác mộng mang tên “Nhầm Identity”
Chắc hẳn nhiều bạn từng một lần “muối mặt” khi lỡ dùng email cá nhân để commit code vào dự án công ty. Kết quả là trên bảng đóng góp (contribution) xuất hiện một cái tên lạ hoắc. Lúc đó, mình phải hì hục git commit --amend lại cả chục commit, cực kỳ mất thời gian và dễ gây lỗi xung đột.
Vấn đề này rất phổ biến khi bạn dùng chung một máy tính cho cả việc công ty, dự án freelance và đóng góp Open Source. Việc gõ git config user.email thủ công cho mỗi repo mới clone vừa tốn sức, vừa dễ quên. Chỉ cần một phút lơ là, lịch sử Git của bạn sẽ trở thành một mớ hỗn độn giữa “việc công” và “việc tư”.
Thay vì sửa sai, hãy để Git tự động hóa việc này bằng tính năng includeIf. Đây là cách mình quản lý hơn 20 dự án khác nhau mà không bao giờ lo nhầm danh tính.
Setup tự động trong 5 phút
Giả sử bạn tổ chức công việc theo cấu trúc thư mục như sau:
~/work/: Chứa toàn bộ dự án của công ty (SaaS, Outsourcing).~/personal/: Nơi lưu các dự án cá nhân hoặc học tập.
Bước 1: Tạo các file config riêng biệt
Đầu tiên, hãy tách cấu hình cho từng môi trường. Tạo file .gitconfig-work tại thư mục Home (~):
# ~/.gitconfig-work
[user]
name = Nguyen Van A (Work)
email = [email protected]
Tương tự, tạo file .gitconfig-personal cho các dự án riêng:
# ~/.gitconfig-personal
[user]
name = DevCute9x
email = [email protected]
Bước 2: Kích hoạt includeIf trong config tổng
Mở file ~/.gitconfig chính và thêm đoạn mã sau vào cuối. Đây chính là nơi phép màu xảy ra:
# ~/.gitconfig
[user]
name = Default Name
email = [email protected]
# Tự động nạp config nếu đang đứng trong thư mục work
[includeIf "gitdir:~/work/"]
path = ~/.gitconfig-work
# Tự động nạp config nếu đang đứng trong thư mục personal
[includeIf "gitdir:~/personal/"]
path = ~/.gitconfig-personal
Điểm mấu chốt: Bạn bắt buộc phải có dấu gạch chéo / ở cuối đường dẫn thư mục. Nếu thiếu nó, Git sẽ không hiểu bạn đang ám chỉ một thư mục gốc và tính năng này sẽ không hoạt động.
Cơ chế hoạt động của includeIf
Git hoạt động theo nguyên tắc ghi đè (override). Khi bạn chạy một lệnh Git, nó sẽ đọc file .gitconfig toàn cục trước. Sau đó, nó kiểm tra xem thư mục hiện tại có khớp với điều kiện gitdir nào không. Nếu khớp, Git sẽ nạp thêm các thiết lập từ file path để ghi đè lên các giá trị cũ.
Cách tiếp cận này buộc bạn phải tổ chức thư mục thật ngăn nắp. Chỉ cần cd vào bất cứ repo nào trong ~/work/, Git sẽ tự hiểu bạn là nhân viên công ty. Khi thoát ra ~/personal/, bạn lại trở về là chính mình.
Mẹo nâng cao: Tự động đổi SSH Key
Đổi Email mới chỉ giải quyết được phần nhìn. Vấn đề xác thực (authentication) mới thực sự gây đau đầu. Nếu công ty dùng GitLab với SSH Key riêng, còn cá nhân dùng GitHub với Key khác, bạn thường phải cấu hình file ~/.ssh/config rất phức tạp.
Có một cách gọn gàng hơn: Dùng core.sshCommand trực tiếp trong file config riêng.
Cập nhật file ~/.gitconfig-work của bạn:
[user]
name = Nguyen Van A (Work)
email = [email protected]
[core]
sshCommand = "ssh -i ~/.ssh/id_rsa_work -o IdentitiesOnly=yes"
Khi bạn git push trong thư mục work/, Git sẽ tự động dùng đúng SSH Key dành cho công việc. Bạn không cần bận tâm về việc ssh-add nhầm key hay bị từ chối truy cập do sai chứng chỉ nữa.
Kinh nghiệm thực tế từ “hiện trường”
Sau nhiều năm áp dụng, mình rút ra 3 lưu ý quan trọng để tránh lỗi vặt:
-
Kiểm tra bằng lệnh: Đừng đoán mò. Hãy gõ
git config user.emailngay khi vào một thư mục mới để xem Git đã nhận đúng identity chưa. -
Dùng cho Windows: Hệ điều hành này đôi khi không phân biệt hoa thường. Bạn nên dùng
gitdir/i:thay vìgitdir:để tránh lỗi do đường dẫn (ví dụ:[includeIf "gitdir/i:C:/Work/"]). - Thứ tự ưu tiên: File nào được include sau sẽ có quyền ưu tiên cao nhất. Hãy đặt các cấu hình chung nhất ở file gốc và các cấu hình đặc thù ở file con.
Việc tách biệt môi trường giúp bạn trông chuyên nghiệp hơn hẳn trong mắt đồng nghiệp. Quan trọng nhất, nó giải phóng bộ não khỏi những việc vặt vãnh để tập trung vào thứ quan trọng hơn: Code.

