原理解析
svn有服务端和客服端,服务端开启端口监听,后台运行.但git是一个分布式版本控制器,所以git没有服务端和客户端之分.也就是说git服务端不会监听任何端口,也不会后台运行.
git服务端搭建和客户端搭建没什么区别.使用的是linux带的ssh进行连接和linux文件权限控制进行管理.
设计
首先给定一个目录,该目录下可以创建各种git仓库.该目录归git用户组管理.以后所有需要连接git服务端的用户全放到git用户组下面.
具体实施
开始之前请先安装git,如果不知道怎么安装可以看我这篇文章Linux安装git
创建用户组和存储仓库的文件夹
我们创建一个git用户组,再创建/home/git目录作为我们git总仓库,以后要添加仓库就在这里添加
groupadd git mkdir /home/git
创建一个测试用户,给该用户相应权限
首先通过which git-shell获取服务端git的shell地址,再创建用户,我的git-shell在
/usr/local/git/bin/git-shell
.useradd -g git -s /usr/local/git/bin/git-shell user01 #添加一个用户 passwd user01 #修改用户密码
上面参数我解释下:
-g
指定用户属于哪个用户组,-s
指定用户登陆时使用的shell(每个linux用户登陆后都会被赋予一个shell,用来和linux内核进行交流.我们使用git的shell就能实现该用户只能使用git命令)
使用git初始化一个没有工作区的仓库
一个git仓库分为工作区和版本控制区,没有工作区就不能在服务端对git仓库进行文件的操作,只能在本地进行操作让服务端进行记录.
--bare
就是创建裸仓库mkdir /home/git/warehouse01.git git init --bare /home/git/warehouse01.git
把创建好的仓库权限赋值给git组
这个大家注意一下,以后每次创建一个新的仓库,一定要执行下面两个命令,否则git用户组没有权限访问新建的仓库
chgrp -R git /home/git/<仓库名> chmod -R 775 /home/git/<仓库名>
千万不要偷懒使用, 因为ssh免密登陆需要保证/home/git/.ssh/authorized_k eys的权限是644, 否则不能免密登陆
chgrp -R git /home/git
chmod -R 775 /home/git
测试
根据上面几步我们就能通过user01远程连接git服务端,并进行git相关操作
测试本地从服务端拉取服务端的warehouse01.git
git clone user01@qiud.top:/home/git/warehouse01.git
上面这个命令我说下,
qiud.top
是我自己买的域名,和我的服务器ip绑定了,这个位置你有绑定ip的域名可以填域名,没有就填ip.执行上面命令会默认连接22号端口.连接成功后会克隆/home/git/warehouse01.git
这个位置的文件夹
测试成功!结果如下:
测试把本地git仓库关联到远程服务端仓库
- 添加一个远程仓库并赋予权限
我们来复习一下怎么添加远程仓库
mkdir /home/git/warehouse02.git cd /home/git/warehouse02.git git init -bare chgrp -R git /home/git chmod -R 775 /home/git
本地创建一个git仓库,并写一个文件
我在d:\git_house下面创建个仓库
local_wh_02
,并且新建了a.txt
文件,添加了aaa
作为内容mkdir local_wh_02 cd local_wh_02 git init echo 'aaa' > /git_house/local_wh_02/a.txt git add . git commit . -m'aaa'
把本地仓库和远程warehouse02.git关联,并把本地仓库中内容推送给远程仓库
git remote add server_wh_02 user01@qiud.top:/home/git/warehouse02.git git push -u server_wh_02 master
顺便说下
git push -u server_wh_02 master
中-u
,这个表示本地仓库该仓库与远程仓库server_wh_02建立了连接关系,以后可以直接执行git push
等命令,不需要再指明远程仓库地址执行成功!
优化
其实根据以上步骤已经可以正常使用了,不用依赖github, 但是每次远程连接的时候都需要输入密码, 这样很麻烦, 所以我们使用公匙密匙进行无密码登陆.
创建公匙和密匙(已经有的同学可以掠过)
本地设置git全局用户名和邮箱
git config --global user.name "1726015433@qq.com" git config --global user.email "1726015433@qq.com"
根据邮箱生成ssh密匙和公匙
ssh-keygen -t rsa -C "1726015433@qq.com"
我的公匙保存位置如下图,你们的也差不多
配置linux服务器的公匙认证
修改sshd的配置文件
vi /etc/ssh/sshd_config
特别说明下公匙存放的位置,是哪个用户登陆的,前面会自动加上家目录.例如:user01登陆,真正的路径是/home/user01/.ssh/authorized_keys 2. 根据公匙存放的位置创建目录
mkdir /home/user01/.ssh
把本地电脑公匙的内容复制到服务器端
scp 'C:/Users/球童/.ssh/id_rsa.pub' root@qiud.top:/home/user01/.ssh/authorized_keys
这个地方要注意以下,因为user01的只能使用git,所以用
ssh-copy-id
是无效的,只能通过root账户把公匙复制到/home/user01/.ssh/authorized_keys
4. 测试
git push