Linux 架設使用 SSH 共享存取的 Git Server

Git 架設使用 HTTP 就是走 Web server 的權限, 走 SSH 就是各個帳號的權限. (Git 的 object 目錄裡面會有權限問題)

若多人共用的話, 要走 SSH 有下述幾種方法:

  1. 建立新帳號(git), 由 git 帳號來統一管理(commit / push) 等
  2. 使用 gitosis 來管理(gitosis 可以設定到 "誰" 可以存取此專案).
  3. 使用 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 公鑰

  1. ssh-keygen -t rsa # 產生 id_rsa, id_rsa.pub
  2. mv id_rsa ~/.ssh/ # 將 id_rsa 放在 ~/.ssh/ 內.
  3. scp id_rsa.pub example.com:/tmp/id_rsa_user1.pub # 將 id_rsa.pub 丟到 Server 上, 大家的 public key 都需要傳到 Server 上.

Git Server 設定

  1. ssh example.com
  2. adduser git --disabled-password # 建立一個 git 帳號, 所有動作都由 git 來執行, 可避免權限問題
  3. su - git # 切換成 git 權限
  4. cd; mkdir .ssh
  5. 將大家的 public key 加入 (可以遠端透過 git 登入的問題, 會於後續設定解決)
  6. cat /tmp/id_rsa_user1.pub >> ~/.ssh/authorized_keys
  7. cat /tmp/id_rsa_user2.pub >> ~/.ssh/authorized_keys
  8. 註: commit / push 還是會保留原始 commit 人得名字, 不會是 git

建立 Git Repository

  1. ssh example.com
  2. su - git
  3. mkdir -p /var/cache/git/project_name.git
  4. cd /var/cache/git/project_name.git
  5. git init --bare --shared

新增資料到 Git Repository

於自己的電腦, 下述兩種作法皆可:

  1. git clone git@example.com:/var/cache/git/project_name.git
  2. cd project_name
  3. vim test.txt
  4. git add .
  5. git commit -m 'add test.txt'
  6. git push origin master

  1. mkdir project_name
  2. cd project_name
  3. git init
  4. git add .
  5. git commit -m 'initial commit'
  6. git remote add origin git@example.com:/var/cache/git/project_name.git
  7. 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

建立完成後, 額外新增專案的方式

  1. ssh example.com
  2. # 之前是 su - git, 但是會因為 git-shell 的原因無法進入
  3. # 所以可以 sudo su - (變成 root) 或 使用 sudo 做下述的步驟.
  4. mkdir -p /var/cache/git/project_name.git
  5. cd /var/cache/git/project_name.git
  6. git init --bare --shared
  7. chown -R git:git /var/cache/git/project_name.git

相關網頁

Alioth/Git - Debian Wiki

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

在〈Linux 架設使用 SSH 共享存取的 Git Server〉中有 10 則留言

  1. 你的教學很好, 從你身上學了很多, 感謝

    現在有一個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 要改成什麼呢?

    萬分感謝

  2. 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
    請大大解答

  3. ""將大家的 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 的資訊呢?

    1. 所以就是只能設定 client 端的 user id,那就沒辦法處理有人自改 ID 冒名的問題囉?

      謝謝您的回覆

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料