利用服务器搭建git仓库

搭建过程全览

一幅图说明搭建原理

利用服务器搭建git仓库

接下来我们解析一下这副图,假设本地计算机是你,远程仓库是你的女朋友,这时候你跟你说朋友说了:我有一批货要时不时藏在你家,我呢给你一个密钥,每次我要是来送货的时候你就核对一下送货人的密钥是不是和我给你的这个密钥是匹配的,如果密钥不匹配那你绝对不能放他进去拿货!!!你女朋友说:好的好的,我知道了。

上面的这段情景呢就是我们图中的SSH连接部分的实现原理。我们为什么要设置一个SSH连接呢????因为如果我们不设置一个SSH连接那么我们每次去女朋友家送货就需要手动输入密码去打开女朋友家的大门然后把货送进去。而我们搭建这个仓库的目的就是为了更加方便的存储货物,每次输入密码太麻烦了,根本无法满足我们高效率的做事理念嘛!所以我们引入一个SSH连接理念,更简单来说SSH连接是直接在你身上镶嵌了一个密钥,省去了你每次过去输入密码的一个环节,让我们送货更加高效。这部分完成了我们搭建git远程仓库的目标已经实现的差不多了,接下来你只要在你女朋友家(远程服务器)随便找个合适的位置放货物就行了。

综上我们要实现的目标只有三个:搭建SSH连接、本地服务器创建一个仓库、远程服务器创建一个仓库

搭建实现

这里我默认你们已经给你们的本地计算机和远程服务器都安装好和配置好了git环境

SSH连接搭建

初始化SSH文件

打开命令行语句,输入以下代码

$ ssh-keygen -t rsa -C "youremail@example.com"
语句解析
ssh-keygen    #意思是生成一个密钥
-t rsa    #ssh-keygen使用RSA算法生成密钥对
-c "youremail@example.com"    #这个就是一个注释语句,没啥实际作用,方便你查找这段密钥是为了哪个目标准备的
执行结果

利用服务器搭建git仓库

这里我要说明一下,如果你是首次创建SSH的话你输入上述生成代码之后直接一直无脑按回车键直到就好了。

如果你不是一次创建ssh密钥的话,你应该在输出ssh生成代码之后注意系统的提示语句:

Enter file in which to save the key (C:\Users\26554/.ssh/id_rsa):  

提示语的意思是系统问你你要保存key(密钥)到哪个文件?而系统默认是将key保存名为id_rsa的文件的,但是如果我们不是第一次创建key,那我们就得换一个文件名给系统让它把key存到新的文件夹去。所以我们要在提示语的冒号后面输入:

C:\用户(Users)\你电脑的当前用户名/.ssh/key文件名字        #这里的配置你根据文子描述根据你自己的电脑具体情况具体填写

以上操作完成之后一直按键盘回车即可

key密钥配置

我们创建好密钥之后我们根据创建好的密钥路径:C:\用户(Users)\你电脑的当前用户名/.ssh/去找到我们刚刚创建好的密钥

然后我们在.ssh文件的位置打开git bash 命令行,输入:

touch config             #生成一个名叫config的文件

我们可以利用config文件来配置多个密钥的使用情况,系统每次启动ssh之后都会检测这个文件。

以上步骤完成之后,效果图如下所示:

利用服务器搭建git仓库

这里介绍一下:tes_rsa.pub就是我们的公钥,config文件就是我们刚刚创建的配置文件。

为服务器创建一个名叫git的新的系统用户

输入以下shell代码即可:

sudo useradd git          
passwd git          #为用户名为git 创建密码

将本地电脑的公钥写入服务器的文件

其实操作很简单我们只要下面这段shell代码即可解决,但是在此之前你要确保你的服务器中拥有.ssh这个文件夹,如果没有代码将执行失败。

type C:\path\to\your\public\key.pub | ssh user@host "cat >> .ssh/authorized_keys"

type是一个Windows命令,用于显示文本文件的内容。

C:\path\to\your\public\key.pub应替换为你的SSH公钥文件的实际路径。这个命令会将公钥文件的内容输出到标准输出(通常是终端或命令行窗口)这里我们把路径换成刚刚我们上面创建的公钥路径即可

user@host 中user就是你服务器中的系统用户名(**就是我们刚刚在上面创建的git用户**),host则填你服务器的IP地址。

authorized_keys是系统默认的文件名字,这段代码执行之后我们本地电脑中的.pub文件里的密钥就写入了服务器authorized_keys中。服务器将根据这个文件里有没有对应的密钥来实现是否同意SSH连接。

以上步骤我们就已经实现了本地服务器和远程服务器中的密钥互持有,到这里我们有个细节要注意,我们得先进入服务器的命令行输入以下shell代码:

$ chmod 644 ~/.ssh/authorized_keys       #authorized_keys文件的权限设为644,即只有文件所有者才能写。如果权限设置不对,SSH 服务器可能会拒绝读取该文件

本地电脑config文件配置

接下来我们对本地电脑中的.ssh中的config文件进行配置

首先我们用记事本打开config文件,然后输入以下格式的内容:

# my_server
Host 随便取个名字   #后续用于ssh连接的时候使用的别名
HostName 服务器IP  #填你服务器的IP
User //你服务器的系统用户名 #这个就是你服务器上创建的系统用户名,我的例子里是叫git
PreferredAuthentications publickey
IdentityFile C:\Users\26554\.ssh\你创建的私钥文件名   #路径就是那个不带.pub后缀的文件路径位置

完成之后我们点击保存即可

到这里我们的SSH就顺利配置完成了,接下来我们在本地计算机打开命令行语句输入:

ssh User@Host       #这里的User你需要替换成服务器的用户名,Host则是直接写上面我们config文件里面的那个让你随便取个名字的Host即可连接

执行结果如下图所示:

利用服务器搭建git仓库

到这里我们的SSH就已经配置好可以使用了

本地git初始化仓库

在本地打开你要传的文件夹输入:

git init 

远程服务器初始化仓库

第一步:进入服务器的git目录内:

cd /home/git/

第二步:创建一个test(名字随意)文件

mkdir test

第三步:修改文件归属者

chown git:git test/

第四步进入刚创建的文件

cd test/

第五步:在此目录下初始化test.git

git init --bare test.git

第六步:修改仓库归属者

chown -R git:git test.git

本地推送到服务器

我们来到我们本地计算机中想要上传的文件夹中打开git bash,输入以下shell语法:

git remote add origin User@Host:/home/git/test/test.git

注意这里的test是我为了测试使用的,请你们根据实际情况更换成你们的仓库名字

还有代码中的origin是git中为服务器取个别名你可以随便取,User@Host我们可以直接填入我在上面config文件配置的User和Host。因为们这里已经实现了SSH连接了,我们可以简化这么写。否则我们的这个Host就得写服务器的IP地址了

接下来就是纯纯的推送操作了:

git push -u origin master   #将项目推送到远程仓库

如果是第一次推送我们需要写上面这段代码,第一次之后我们直接使用git push即可:

git push  

从服务器拉取文件到本地

其实很简单,我们输入以下代码即可:

git clone  User@Host:/home/git/test/test.git

整体的结构就是git clone 加上我们刚刚说的config文件里面的User和Host 再加上在远程服务器里面仓库位置即可

以上就是利用一台自己的服务器去搭建一个git仓库的所有内容了,有了它你就不再需要受到Gitee和GitHub限制1GB的仓库存储的限制啦

细节补充

问题一

如果出现服务器和本地之间SSH公钥配置好了之后进行连接系统显示:

Permission denied (gssapi-keyex,gssapi-with-mic,password).

那么我推荐你一定要去服务器那头输入:

cd ../ect/ssh   #这段代码基于你连接的是你新建的git用户组而不是root组
vim sshd_config #vim是一个文本编辑器,没有的自己去百度一下下载一个或者用别文本编辑器

打开 "sshd_config" 之后我们在里面找到 PubkeyAuthentication ,如果PubkeyAuthentication后面是 no ,那恭喜你找到问题了,你把这个no改成yes就打工告成了,最后我们输入重启ssh的指令让其生效即可,重启ssh的指令如下:

sudo systemctl restart sshd

问题二

我们的git用户组没有root权限怎么办???
很简单,我们输入以下代码即可:

cd ../etc
vim sudoers

在sudoers文件的最后一行添加即可:

git ALL=(ALL) ALL

这里我是新建了一个系统用户叫git,你们如果新建的用户不加git,那你们要把上面代码中的git改成你对应的用户名