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 [email protected]:/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 [email protected]:/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 [email protected]:/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
- Git on the Server - Setting Up the Server
Alioth/Git - Debian Wiki
你的教學很好, 從你身上學了很多, 感謝
現在有一個Git Server的問題, 因為本人的網站是Windows Server, 也在用VisialSVN, 正打算改用Git, 但碰到 ssh key的問題就不知如何做.
如果用msysGit安裝在我的 Windows Server, 各開發人員 (Mac) 是否同樣用 "scp id_rsa.pub example.com:/tmp/id_rsa_user1.pub" 上載ssh key呢? example.com:/tmp/id_rsa_user1.pub 要改成什麼呢?
萬分感謝
我不知道 msysGit 是走什麼協定耶.
基本上, 只要是走 ssh 協定的, 都需要 ssh key. 🙂
如果是 windows server 可能要借助 cygwin 架設 sshd 就可以了
不過如果在 M$ 平台建議可以考慮 git over http 可能會比較方便
嗯嗯, 感謝. 🙂
root@lamp ~# 鍵入 scp id_rsa.pub example.com:/tmd/id_rsa_user1
出現錯誤訊息,我之前做到後面都可以到 push 之後也是跳這個訊息
_ssh: connect to host example.com port 22: Network is unreachable
lost connection
請大大解答
你的網路不通? 或 ssh port 不通.
""將大家的 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""
請問這邊指的是 client 端自行設定的名字,還是哪裡可以查看此次 commit 是哪一支 key 的資訊呢?
應該是 client 端的 user id
所以就是只能設定 client 端的 user id,那就沒辦法處理有人自改 ID 冒名的問題囉?
謝謝您的回覆