2 giờ sáng, deadline 8 giờ sáng. Thằng bạn cùng team ngồi cách bạn 3 mét trong văn phòng cần pull code về, nhưng VPN công ty đang chết, GitHub thì chậm như rùa, còn SSH key thì chưa setup. Lúc này mà đi dựng GitLab hay Gitea thì mất cả tiếng.
May mà Git tích hợp sẵn thứ này: git daemon — built-in, không cần cài thêm gì, chạy được trong 30 giây.
Quick Start: Chạy ngay trong 5 phút
Giả sử máy bạn (server) có IP 192.168.1.100, muốn share repo /home/user/myproject cho đồng nghiệp trong cùng mạng.
Bước 1: Trên máy server — bật git daemon
# Di chuyển vào thư mục cha chứa repo
cd /home/user/
# Bật git daemon, export tất cả repo trong thư mục hiện tại
git daemon --reuseaddr --base-path=. --export-all --verbose .
Chạy xong bạn sẽ thấy dòng:
[32948] Ready to rumble
Git daemon đang lắng nghe trên port 9418 (port mặc định của git protocol). Terminal này cứ để đó, đừng tắt.
Bước 2: Trên máy client — clone hoặc fetch
# Clone repo từ server
git clone git://192.168.1.100/myproject
# Hoặc nếu đã có repo local, thêm remote rồi fetch
git remote add lan git://192.168.1.100/myproject
git fetch lan
git merge lan/main
Xong. Không password, không SSH key, không tài khoản. Khi xong việc, nhấn Ctrl+C trên máy server để tắt daemon.
Giải thích chi tiết: git daemon hoạt động thế nào?
git daemon là lightweight server tích hợp sẵn trong Git — không cần cài thêm, không cần config phức tạp. Nó chạy trên git protocol (scheme git://), khác hẳn HTTPS hay SSH: không mã hóa, không authentication, không TLS handshake overhead. Trên LAN gigabit, clone repo 500MB thường mất dưới 15 giây. Nhưng thiếu auth cũng là lý do nó chỉ nên sống trong mạng nội bộ bạn tin tưởng.
Các tham số quan trọng
--reuseaddr: Bind lại port ngay sau khi restart, tránh lỗi “address already in use”--base-path=.: Đặt thư mục gốc — client chỉ cần gõ tên repo, không cần path đầy đủ--export-all: Serve tất cả repo trong base-path, không cần file marker--verbose: Log từng request ra terminal, hữu ích khi debug kết nối.ở cuối: Thư mục cụ thể cần serve (có thể là absolute path)
Không dùng –export-all? Cần file marker
Bỏ --export-all thì git daemon chỉ serve repo nào có file này trong .git/:
touch /home/user/myproject/.git/git-daemon-export-ok
Cách này tiện hơn khi có nhiều repo cùng chỗ nhưng chỉ muốn share một cái — không lo lộ repo khác.
Tìm IP máy mình nhanh
# Linux
hostname -I
# hoặc
ip addr show | grep "inet " | grep -v 127.0.0.1
# macOS
ipconfig getifaddr en0
Các tình huống thực tế
Chạy trên port khác
Port 9418 bị firewall chặn, hoặc đã có process khác chiếm:
# Server: chạy trên port 9999
git daemon --reuseaddr --export-all --port=9999 --base-path=. --verbose .
# Client kết nối
git clone git://192.168.1.100:9999/myproject
Cho phép push — cẩn thận!
Mặc định git daemon chỉ cho phép đọc (clone/fetch). Muốn cho phép push:
git daemon --reuseaddr --export-all --enable=receive-pack --base-path=. --verbose .
Mình từng mất code quan trọng vì force push nhầm branch — từ đó luôn dè chừng với git push --force. Khi bật receive-pack trong LAN, bất kỳ ai kết nối được đều có thể push thoải mái, kể cả force push, mà không cần hỏi. Chỉ bật khi bạn tin hoàn toàn những người trong mạng đó.
Chạy background với nohup
Cần daemon chạy nền để tiếp tục làm việc trên terminal:
# Chạy background, log ra file
nohup git daemon --reuseaddr --export-all \
--base-path=/home/user/repos \
--verbose /home/user/repos \
> /tmp/git-daemon.log 2>&1 &
# Xem log realtime
tail -f /tmp/git-daemon.log
# Tắt daemon khi xong
kill $(lsof -ti:9418)
Mở firewall nếu cần
# Ubuntu/Debian với ufw
sudo ufw allow 9418/tcp
# Tắt sau khi dùng xong
sudo ufw delete allow 9418/tcp
# CentOS/RHEL với firewalld
sudo firewall-cmd --add-port=9418/tcp --zone=public
sudo firewall-cmd --remove-port=9418/tcp --zone=public
Tips thực tế
Khi nào dùng git daemon, khi nào không?
- Hợp lý: Share code nhanh trong LAN/WiFi nội bộ, demo cho đồng nghiệp, môi trường dev tạm thời, hackathon, pair programming không cần internet
- Tránh: Môi trường production, internet công cộng (không có authentication), repo chứa secret/API key, khi cần biết ai đã push gì
Khi git daemon không dùng được: git bundle
Port 9418 bị chặn hoàn toàn, hoặc cần chuyển code qua USB:
# Phía server: đóng gói toàn bộ repo thành 1 file
git bundle create myproject.bundle --all
# Copy file này qua USB, scp, AirDrop, bất cứ thứ gì
# Phía client: clone từ bundle
git clone myproject.bundle myproject-local
Bundle giữ nguyên toàn bộ commit, branch, tag — không khác gì clone từ remote thật. Git tự nén data theo kiểu packfile, nên với code thuần thường nhỏ hơn đáng kể so với copy nguyên thư mục .git. Không cần network, không cần server.
Kiểm tra kết nối từ client
# Kiểm tra port 9418 có mở không trước khi clone
nc -zv 192.168.1.100 9418
# Kết quả: Connection to 192.168.1.100 9418 port [tcp/*] succeeded!
# Nếu không có nc
nmap -p 9418 192.168.1.100
nc báo connection refused thì check firewall trên máy server, hoặc thêm --port để đổi sang port khác.
git daemon là thứ bạn sẽ không nghĩ đến cho đến khi cần — rồi sau đó nhớ mãi. Không phải công cụ dùng hàng ngày, và không replace được GitHub. Nhưng lúc 2 giờ sáng, deadline còn mấy tiếng, đồng nghiệp ngồi ngay cạnh cần pull code gấp — 30 giây với git daemon beats mọi thứ khác.
