01-----在Ubuntu16.04上搭建git服务器

一 在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服务器


版权声明:本文为weixin_44517656原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。