最近一个项目需要重构,由于还没立项,不能申请版本库,一开始开发的时候需要用代码比较工具手动进行代码合并。这样做效率实在太低,不仅容易漏掉代码,还可能引入bug。看到组里面有很多测试用的服务器,因此提出一个方案,自己搭建git服务器。
参考了很多网上的教程,最终成功搭好了,但是踩了很多坑。因此这边总结了一套完整可复现的步骤,希望看这篇文章的同学可以少踩一些坑。
强烈推荐用Ubuntu或Debian,我自己阿里云服务器的Ubuntu系统很顺利就配置好了,公司的CentOS折腾了半天。
1. 安装Git
首先需要在服务器上安装Git。如果是Ubuntu系统执行下面的命令:
$ apt-get install git
如果是CentOS系统执行下面的命令:
$ yum -y install git
如果当前不是 root
用户,需要在命令前加 sudo
。
2. 创建用户
实际测试发现,adduser
和 useradd
两个命令都可以用。如果是Ubuntu系统,执行 adduser
之后基本就是一套傻瓜式配置流程,按照提示设置密码和其他信息即可:
$ adduser git # 创建一个git用户
如果是CentOS,执行 adduser
则不会有提示,还需要手动设置密码:
$ passwd git # 给git用户设置密码
注意:输入
passwd git
后按回车,就会提示让你输入密码,如果密码设置比较简单,可能会出现警告信息,不要管他,再输入一遍就可以了。
在Linux系统下,root
用户有权限更改其他用户的密码,而不用知道原来的密码。其他用户只能更改自己的密码。如果当前不是 root
用户,需要在命令前加 sudo
。
3. 创建证书
使用证书的目的就是免密 ssh 登录。在本地环境创建一个 ssh 密钥,如果已创建可以跳过这步:
$ ssh-keygen -t rsa
找到密钥存放的路径,把 id_rsa.pub
里面的内容,导入到服务器的 /home/git/.ssh/authorized_keys
里面。
我在测试的时候,/home/git
下面没有 .ssh
,我就自己建了一个。
如果有其他用户也需要登录,把他们的公钥也放到这里,一行一个。
4. 初始化Git仓库
选定一个目录作为Git仓库,在这个目录下执行命令:
$ git init --bare sample.git
注意仓库目录最好在
/home/git
下面,如果是其他目录,在后面执行git clone
的时候可能会提示 … dose not appear to be a git repositry
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。
然后,把owner改为git:
$ chown -R git:git sample.git
如果当前不是 root
用户,需要在命令前加 sudo
。
5. 禁用shell登录
出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。
我们团队只有两三人,所以没有做这个设置。
6. 克隆远程仓库
接下来就可以让每个人在各自的电脑上运行 git clone
命令了。命令的格式如下:
$ git clone username@server:repositry path
例如:
$ git clone [email protected]:/home/git/repo/cm-refactor.git
这里有一个问题,Git默认的端口号是 22
,而公司服务器的 ssh 端口是 2343
,我们知道如果 ssh 登录的话是支持指定端口号的,例如:
$ ssh -p 2343 [email protected]
但是 git clone
命令不能这样设置,这个时候就需要这样:
$ git clone ssh://git@hostname:port/.../xxx.git
例如:
$ git clone ssh://[email protected]:2343/home/git/repo/cm-refactor.git