为什么要搭建Git私服?

  • GitHub、Gitee 私有仓库都是限流的,文件一旦多了,或者有图片文件,git pull 的时候半天拉不下来
  • 自己的文档难免有自己个人信息,放在 GitHub 心里也是担心的
  • 私有仓库可以N多个人合作使用,不受限制(这个一般同学用不上)

如何找到可以外网访问服务器?

使用云服务器

开始搭建

登录服务器

ssh root@ip

服务器端安装Git

检查服务器是否安装Git

  • 出现如下信息则证明已经安装了Gitimage.png

  • 否则,使用 yum install git 安装(默认版本1.8.3.1)image.png

服务器端设置Git账户

  • 原因:新建账户为避免在常用Linux账户下操作时,使用 rm -rf * 把数据全删除了
  • 新增用户并设置密码,示例:image.png
  • 切换到Git账户,进行后面的操作image.png

检查下当前所在目录,是否在git目录下面

服务器端密钥管理

  1. 创建 .ssh 目录image.png

原因:避免每次操作Git仓库的时候输入密码

  1. 进入.ssh文件下,创建一个authorized_keys文件(即客户端的公钥)image.png

  2. 设置authorized_keys 权限,保证能够免密登录image.png

  3. 把客户端的公钥放在git服务器上。

首先,回到客户端,创建一个公钥。在自己的电脑上,有公钥与私钥,对应文件分别是 id_rsaid_rsa.pub

  • 如果是 Windows 系统公钥私钥的目录在 C:\Users\用户名.ssh 下。
  • 如果是 Mac 或者 Linux, 公钥和私钥的目录这里 cd ~/.ssh/

如果发现自己的电脑上没有公钥私钥,那就自己创建一个。 image.png
创建密钥的过程中,一路点击回车就可以了。不需要填任何东西。

然后,把公钥拷贝到 Git 服务器上,将我们刚刚生成的 id_rsa.pub,拷贝到 Git 服务器的 /home/git/.ssh/ 目录。

在Git服务器上,将公钥添加到 authorized_keys文件中
image.png

也可以通过在客户端,将公钥直接上传到服务器端 ssh-copy-id username@host
image.png
并且可在客户端将别名写入config文件中(下次登录可以直接通过ssh 服务器端别名代替ssh git@ip)。如下,直接在客户端通过 ssh git 即可直接git登录服务器端
image.pngimage.png

服务器端部署Git仓库

  1. 创建仓库前的准备
  • 登录到 Git 服务器端,并切换为 Git 账户
  • 从 root 账户切换到Git账户 su git
  • 从其他账户切换到 Git账户 sudo su git
  • 进入到 git 目录下 cd ~/git
  1. 创建仓库示例
  • 创建一个文件名为 word.git 的文件夹(文件夹名字后为 .git,是为了和 github 的命名规则相同)

mkdir word.git
cd word.git

  • 初始化仓库

git init --bare

至此,服务器端仓库搭建完毕。

客户端连接远程仓库

  1. 选择自己想要进行备份的文件,并创建文件夹

(此处文件夹的命名并不作要求,但为了与 Git服务器端的仓库名称同步,直观的显示我们操作的是哪一仓库。可使用相同的命名)

  • 示例:在客户端创建文件夹 word,并进行初始化操作

mkdir word
cd word
git init

  1. 创建测试文件,并将其添加到 Git版本管理中

touch test
git add test
git commit -m "add test file"

  1. 将此仓库与远端仓库同步

git remote add origin git@git服务器端ip:word.git
git push -u origin master
此时test测试文件就已经提交到我们的Git远端服务器上

关于服务器仓库使用 git init --bare 的原因

从前文可以看出,远端服务器仓库初始化使用 git init --bare,原因如下:

  • git init --bare 初始化是裸仓库,无法在该文件夹下进行 git 操作。报错"This operation must be run in a work tree"
  • 通过该命令初始化生成的裸仓库是没有工作区的,只会记录git提交的历史信息。通过 git log 可以看到各个版本信息,但无法进行版本回退或者切换分支的操作
  • 这样设置的目的是避免服务器端仓库用户正在master分支操作,但此时有更新提交到master分支上,出现报错
  • 但同时也存在一个优点是,可以通过添加hooks钩子在同级目录下新建一个存放项目源码的文件夹(git仓库与项目源码分离,推送的更新会马上显示在项目文件上)