为什么要搭建Git私服?
- GitHub、Gitee 私有仓库都是限流的,文件一旦多了,或者有图片文件,
git pull的时候半天拉不下来 - 自己的文档难免有自己个人信息,放在 GitHub 心里也是担心的
- 私有仓库可以N多个人合作使用,不受限制(这个一般同学用不上)
如何找到可以外网访问服务器?
使用云服务器
开始搭建
登录服务器
ssh root@ip
服务器端安装Git
检查服务器是否安装Git
出现如下信息则证明已经安装了Git

否则,使用
yum install git安装(默认版本1.8.3.1)
服务器端设置Git账户
- 原因:新建账户为避免在常用Linux账户下操作时,使用
rm -rf *把数据全删除了 - 新增用户并设置密码,示例:

- 切换到Git账户,进行后面的操作

检查下当前所在目录,是否在git目录下面
服务器端密钥管理
- 创建
.ssh目录
原因:避免每次操作Git仓库的时候输入密码
进入
.ssh文件下,创建一个authorized_keys文件(即客户端的公钥)
设置
authorized_keys权限,保证能够免密登录
把客户端的公钥放在git服务器上。
首先,回到客户端,创建一个公钥。在自己的电脑上,有公钥与私钥,对应文件分别是 id_rsa 和 id_rsa.pub
- 如果是 Windows 系统公钥私钥的目录在
C:\Users\用户名.ssh下。 - 如果是 Mac 或者 Linux, 公钥和私钥的目录这里
cd ~/.ssh/,
如果发现自己的电脑上没有公钥私钥,那就自己创建一个。 
创建密钥的过程中,一路点击回车就可以了。不需要填任何东西。
然后,把公钥拷贝到 Git 服务器上,将我们刚刚生成的 id_rsa.pub,拷贝到 Git 服务器的 /home/git/.ssh/ 目录。
在Git服务器上,将公钥添加到 authorized_keys文件中
也可以通过在客户端,将公钥直接上传到服务器端 ssh-copy-id username@host
并且可在客户端将别名写入config文件中(下次登录可以直接通过ssh 服务器端别名代替ssh git@ip)。如下,直接在客户端通过 ssh git 即可直接git登录服务器端

服务器端部署Git仓库
- 创建仓库前的准备
- 登录到 Git 服务器端,并切换为 Git 账户
- 从 root 账户切换到Git账户
su git - 从其他账户切换到 Git账户
sudo su git - 进入到 git 目录下
cd ~/git
- 创建仓库示例
- 创建一个文件名为
word.git的文件夹(文件夹名字后为.git,是为了和 github 的命名规则相同)
mkdir word.gitcd word.git
- 初始化仓库
git init --bare
至此,服务器端仓库搭建完毕。
客户端连接远程仓库
- 选择自己想要进行备份的文件,并创建文件夹
(此处文件夹的命名并不作要求,但为了与 Git服务器端的仓库名称同步,直观的显示我们操作的是哪一仓库。可使用相同的命名)
- 示例:在客户端创建文件夹
word,并进行初始化操作
mkdir wordcd wordgit init
- 创建测试文件,并将其添加到 Git版本管理中
touch testgit add testgit commit -m "add test file"
- 将此仓库与远端仓库同步
git remote add origin git@git服务器端ip:word.gitgit 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仓库与项目源码分离,推送的更新会马上显示在项目文件上)
