Linux 上建立 Git 伺服器 文章首圖

Linux 上建立 Git 伺服器

Linux 上建立 Git 伺服器

在現代軟體開發流程中,版本控制是不可或缺的工具。雖然 GitHub 或 GitLab 等雲端服務提供了便捷的協作環境,但在企業內部網路、隱私敏感專案或追求極致效能的情境下,架設自己的 Git 伺服器(Self-hosted Git Server)依然是許多開發者與系統管理員的首選。

這篇文章將帶領你使用 Ubuntu 22.04 或 Debian 12,透過最輕量且經典的方式——Git DaemonSSH,來建立一個高效能的私有 Git 伺服器。我們將專注於「bare repository」(空倉儲)的概念,這是在伺服器端管理程式碼的標準實踐。

前置準備與環境安裝

首先,請確保你的伺服器已經安裝了必要的軟體套件。在 Debian 系的系統中,我們只需要安裝 git 即可,因為它包含了所有我們需要的核心元件。

sudo apt update
sudo apt install git

安裝完成後,我們需要建立一個專門用於管理 Git 倉庫的系統使用者。為了安全起見,不建議使用 root 帳號直接操作。

# 建立 git 使用者,並禁止其登入 shell
sudo adduser --system --group --disabled-password --shell /bin/git-shell git

這裡使用了 --shell /bin/git-shell,這是一個特殊的 shell,它只允許執行 Git 相關的指令(如 git-receive-pack, git-upload-pack),防止使用者透過 SSH 登入伺服器執行其他命令,大幅提升安全性。

建立第一個 Bare Repository

Git 伺服器端的倉庫必須是「bare」(空)倉庫,也就是說,它不包含工作樹(working tree),只包含版本控制的資料庫結構。

# 切換到 git 使用者
sudo su - git

# 建立倉庫目錄
mkdir -p /home/git/repositories
cd /home/git/repositories

# 初始化一個 bare repository,命名為 myproject.git
git init --bare myproject.git

現在,/home/git/repositories/myproject.git 就是一個可以接受推送(push)的遠端倉庫了。請務必確認該目錄的擁有者是 git 使用者,且權限設定正確(通常 755 或 775 視需求而定)。

exit # 回到 root 或一般使用者
sudo chown -R git:git /home/git/repositories
sudo chmod -R 755 /home/git/repositories

透過 SSH 存取伺服器

對於大多數開發者而言,SSH 是最安全且常見的協定。只要客戶端能 SSH 連線到伺服器,就可以直接操作 Git。

假設你的伺服器 IP 是 192.168.1.100,客戶端電腦上的操作如下:

# 克隆倉庫(第一次會要求輸入 git 使用者的密碼)
git clone git@192.168.1.100:/home/git/repositories/myproject.git

# 進入目錄並進行測試提交
cd myproject
echo "Hello World" > README.md
git add .
git commit -m "Initial commit"
git push origin master

如果一切順利,你應該能看到程式碼成功推送至伺服器。這種方式不需要額外的 daemon 服務,配置簡單且安全性高,適合小型團隊或個人專案。

透過 Git Daemon 提供無驗證存取(可選)

如果你希望提供類似 GitHub 公開倉庫的體驗,不需要 SSH 金鑰驗證,可以使用 git-daemon。這通常用於內部網路中不需要嚴格身份驗證的環境。

首先,安裝 git-daemon-run(Debian/Ubuntu 套件):

sudo apt install git-daemon-run

編輯 /etc/default/git-daemon 檔案,設定允許的根目錄和監聽位置:

# /etc/default/git-daemon
OPTIONS="--enable=receive-pack --reuseaddr --base-path=/home/git/repositories"

這裡的 --enable=receive-pack 允許客戶端推送代碼,--base-path 指定了倉庫的根目錄。

重新啟動服務:

sudo systemctl restart git-daemon

現在,客戶端可以透過 git:// 協定存取:

git clone git://192.168.1.100/myproject.git

注意git:// 協定是明碼傳輸,不加密也不驗證身份。請務必僅在受信任的內部網路中使用,或配合防火牆限制來源 IP。

常見問題與解決方案

1. 推送時出現 "Permission denied (publickey)" 錯誤 這通常是因為客戶端沒有配置正確的 SSH 金鑰,或者 git 使用者的 .ssh/authorized_keys 檔案權限錯誤。請確保 git 使用者的家目錄權限為 700,.ssh 目錄為 700,authorized_keys 為 600。

sudo chmod 700 /home/git
sudo chmod 700 /home/git/.ssh
sudo chmod 600 /home/git/.ssh/authorized_keys

2. 如何限制特定使用者只能讀取,不能推送? SSH 方式可以透過設定不同的 SSH 金鑰來實現。對於 Git Daemon,由於缺乏原生權限控制,建議結合防火牆規則或改用更進階的解決方案如 GitLab 或 Gitea。若堅持使用 Git Daemon,可考慮在客戶端權限層面進行管理。

小結

透過上述步驟,你已經成功在 Linux 上建立了一個輕量且高效的私有 Git 伺服器。對於小型團隊或個人開發者,SSH + Bare Repository 是最推薦的起步方式,它結合了安全性與易用性。當團隊規模擴大或需要更豐富的功能(如 Web UI、Issue 追蹤、CI/CD 整合)時,你可以考慮遷移至 GitLab 或 Gitea 等全功能解決方案。

無論選擇哪種方式,理解 Git 伺服器底層運作原理,都能幫助你在遇到問題時更快進行除錯與優化。現在,就開啟你的終端機,建立屬於你的第一個私有倉庫吧!