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 [email protected]:/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 [email protected]:/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.

    <font face="Courier New">git:x:1000:1000::/home/git:/bin/sh</font>

    改成

    <font face="Courier New">git:x:1000:1000::/home/git:<strong>/usr/bin/git-shell</strong></font>

    即可.

常用指令笔记

  • Clone: git clone [email protected]:/var/cache/git/project_name.git
  • Commit & Push: git push
  • 第一次 Commit / Push 的指令: git push origin master

ssh

相关推荐