Git 架設使用 HTTP 就是走 Web server 的權限, 走 SSH 就是各個帳號的權限. (Git 的 object 目錄裡面會有權限問題)
若多人共用的話, 要走 SSH 有下述幾種方法:
- 建立新帳號(git), 由 git 帳號來統一管理(commit / push) 等
- 使用 gitosis 來管理(gitosis 可以設定到 "誰" 可以存取此專案).
- 使用 gitolite 來管理(gitolite 可以設定 "誰" 可以存取此專案, 而且, 可以設定只能存取哪個 branch 等路徑)
在此篇是採用 建立一個 git 帳號來統一管理的方法.
相關資料準備
- 系統: Debian / Ubuntu Linux
- Server: example.com
- Project name: project_name
- Git Repository: /var/cache/git
系統套件安裝
- apt-get install git-core
產生 SSH 公鑰
- ssh-keygen -t rsa # 產生 id_rsa, id_rsa.pub
- mv id_rsa ~/.ssh/ # 將 id_rsa 放在 ~/.ssh/ 內.
- scp id_rsa.pub example.com:/tmp/id_rsa_user1.pub # 將 id_rsa.pub 丟到 Server 上, 大家的 public key 都需要傳到 Server 上.
Git Server 設定
- ssh example.com
- adduser git --disabled-password # 建立一個 git 帳號, 所有動作都由 git 來執行, 可避免權限問題
- su - git # 切換成 git 權限
- cd; mkdir .ssh
- 將大家的 public key 加入 (可以遠端透過 git 登入的問題, 會於後續設定解決)
- cat /tmp/id_rsa_user1.pub >> ~/.ssh/authorized_keys
- cat /tmp/id_rsa_user2.pub >> ~/.ssh/authorized_keys
- 註: commit / push 還是會保留原始 commit 人得名字, 不會是 git
建立 Git Repository
- ssh example.com
- su - git
- mkdir -p /var/cache/git/project_name.git
- cd /var/cache/git/project_name.git
- git init --bare --shared
新增資料到 Git Repository
於自己的電腦, 下述兩種作法皆可:
- git clone git@example.com:/var/cache/git/project_name.git
- cd project_name
- vim test.txt
- git add .
- git commit -m 'add test.txt'
- git push origin master
或
- mkdir project_name
- cd project_name
- git init
- git add .
- git commit -m 'initial commit'
- git remote add origin git@example.com:/var/cache/git/project_name.git
- git push origin master
避免 Git 帳號登入 (安全問題)
- vim /etc/passwd # 修改 /bin/sh => /usr/bin/git-shell, git-shell 只能做 git 操作, 無法 Login.
將git:x:1000:1000::/home/git:/bin/sh
改成
git:x:1000:1000::/home/git:/usr/bin/git-shell
即可.
常用指令筆記
- Clone: git clone git@example.com:/var/cache/git/project_name.git
- Commit & Push: git push
- 第一次 Commit / Push 的指令: git push origin master
建立完成後, 額外新增專案的方式
- ssh example.com
- # 之前是 su - git, 但是會因為 git-shell 的原因無法進入
- # 所以可以 sudo su - (變成 root) 或 使用 sudo 做下述的步驟.
- mkdir -p /var/cache/git/project_name.git
- cd /var/cache/git/project_name.git
- git init --bare --shared
- chown -R git:git /var/cache/git/project_name.git
相關網頁
- 小組級 Git 服務器搭建 - 推薦此篇
- 8 ways to share your git repository - 把所有 Git Repository 分享的方法都列出來了, 推薦有空可以看此篇
- Git server setup via ssh
- 如何架設 Git
- Alioth/Git - Debian Wiki