一 在Ubuntu16.04上搭建git服务器的步骤
1 下载git
apt-get install -y git
//注:上面可能下载失败,更新一下包即可,然后重新下载。
apt-get update
apt-get install -y git
git --version //下载成功可以看到版本号
2 创建新的用户来管理git仓库
cd /home //进入/home/目录
id git //id是一个与用户相关的命令,这里是查看git用户是否存在,详看id --help
useradd git //创建git用户
//为git用户创建密码,这里最好通过su - git去确定一下密码是否正确,否则后面git clone时无法执行
passwd git
3 创建git仓库,并且将管理者变成新创建的git用户
mkdir -p ./git/repository/gittest.git //在git用户目录下创建仓库目录repositroy,并且创建gittest.git项目测试目录
ls //查看目前系统的用户
cd git/repository/
ls
git init --bare ./gittest.git //这步非常重要,初始化项目测试目录
ls gittest.git/ //查看该裸仓库的信息
ll //查看gittest.git项目文件夹的拥有者
chown -R git:git ../repository //将项目拥有者改为git用户
ll
注意这一步,我们创建远程的git仓库时,绝对不能和创建普通的git仓库的初始化命令一样,必须加上- -bare,代表裸仓库,否则可能会出现冲突的问题。
两者区别具体参考以下文章:
关于git init 和 git init --bare 的区别
4 Windows客户端clone项目
随便找一个空目录中打开git_bash,然后克隆,输入密码即可。
git clone git@192.168.1.9:/home/git/repository/gittest.git
执行完上面的命令,此时 C:\Users\用户名.ssh 下会多出一个文件 known_hosts。
结果如下图,由于我们的项目是空的,所以克隆下来的也是空的。
注意:
上面输入git用户的密码时,可能会出现错误,原因我在上面强调过,是因为密码没有成功保存,当我们再用passwd修改密码时,会出现以下错误(注意并不是隐藏属性-i的问题):
passwd: Authentication token manipulation error
解决:将该用户和/home下的git目录删除,重新按照上面的步骤操作一遍即可,再次强调,必须验证一下由其它用户能否正常切换到git用户,正常即密码有效。
userdel -r git //-r表示打勾临时文件,即将与git用户的临时文件也删除
rm -rf /home/git && rm -rf ./git //删除git目录
由于上面的clone方法每次clone项目都要输入服务器端用户的密码,还是比较麻烦的,因此下面我将介绍用公钥的方式来clone git项目。
5 客户端创建 SSH 公钥和私钥
5.1 打开windows的git,通过命令
ssh-keygen -C "your@email.com" //your可以任意名字,然后连续按下确定即可。
此时 C:\Users\用户名.ssh 下会多出两个文件 id_rsa 和 id_rsa.pub。id_rsa_git 是私钥,id_rsa_git.pub 是公钥。
5.2 在ubuntu下切换到root账号,创建保存公钥的文件夹
- 1)在root用户下,修改vim /etc/ssh/sshd_config文件。
vim /etc/ssh/sshd_config
//找到下面三行内容,将下面的配置开启,不要注释,即去掉,然后保存#。
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
- 2)重启 sshd 服务。
sudo service sshd restart #重启sshd服务
注意:有可能出现重启失败,原因是官方bug造成的。解决:
sudo apt-get install openssh-server #再次安装
sudo service sshd restart #再次重启sshd服务就行
- 3)由 AuthorizedKeysFile 得知公钥的存放路径是 %h/.ssh/authorized_keys,实际上是 $Home/.ssh/authorized_keys,由于管理 Git 服务的用户是 git,所以实际存放公钥的路径是 /home/git/.ssh/authorized_keys。在 /home/git/ 下创建目录 .ssh:
mkdir .ssh
chown -R git:git .ssh //把 .ssh 文件夹的 owner 修改为 git
ll -a | grep .ssh
5.3 客户端导入公钥
回到客户端Git Bash 下,执行以下命令导入文件(当然也可以直接将公钥的数据直接复制到.ssh/authorized_keys里面):
ssh git@192.168.1.9 'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
然后查看是否有该公钥生成,我的如下。
cd /home/git/.ssh/
vim authorized_keys
5.4 配置.ssh的权限
修改 .ssh 目录的权限为 700。修改 .ssh/authorized_keys 文件的权限为 600。
chmod 700 ../ssh
chmod 600 authorized_keys
6 再次测试拷贝项目
git clone git@192.168.1.9:/home/git/repository/gittest.git
对比上面可以看到,此时不再需要输入passwd。
7 禁用git用户ssh登陆服务器
因为我们既然使用了公钥来clone下来项目,那么就需要禁用git用户通过ssh登陆服务器来保证安全。
sudo vim /etc/passwd #编辑/etc/passwd文件
找到下面的内容:
#找到:
git:x:1001:1001::/home/git:/bin/bash
#修改为:
git:x:1001:1001::/home/git:/bin/git-shell
或者直接使用命令(建议这种):
usermod -s /bin/git-shell git
此时可以看到默认bash被修改成下面的/bin/git-shell。
8 其它扩展
8.1 管理公钥
如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就不能这么搞了,这时,可以用Gitosis来管理公钥,想了解的可以百度具体查询一下。
8.2 管理权限
有很多公司很看重源代码,会在版本控制系统里设置一套完善的权限控制,每个人是否有读写权限会精确到每个分支甚至每个目录下。因为Git是为Linux源代码托管而开发的,所以Git也继承了开源社区的精神,不支持权限控制。不过,因为Git支持钩子(hook),所以,可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的。Gitolite就是这个工具。
参考文章:
在Ubuntu上搭建git服务器