乐趣区

关于git:搭建git远程仓库

Linux 上搭建 Git 服务器

artoria 2019-01-07 14:37:57 3659 珍藏 12

分类专栏:Linux Git 文章标签:Git RSA

版权

因为 github 能够收费帮咱们治理我的项目(即我的项目的版本控制),因而咱们通常会将一些开源我的项目放在 github 的公共仓库。
但咱们常常会有这样的需要:出于商业目标,咱们必须要我的项目的源文件进行窃密。
这个时候再用 github 的公有仓库治理咱们的我的项目就不适合—github 的公有仓库前两天还是“免费”的呀,当初收费了。
这个时候,咱们就能够思考搭建一个公有的 Git 服务器。
以下是阿里云服务器 Linux 作为服务器零碎,本机 Windows 作为客户端零碎进行示例阐明。

装置 Git

Linux 上通过 yum 命令装置 Git

`# 通过 yum 工具拉取并装置最新版本的 git 工具包
yum install git
# 正确显示 git 的版本号,则示意曾经正确装置
git --version

# 咱们默认都是通过“git 用户”来治理 git 服务器,因而要新建一个 git 用户
# 测试服务器上是否有 git 用户
id git
# 如果没有,则通过如下命令增加一个 git 组下的 git 用户,并为 git 用户设置登录明码
groupadd git
useradd -g git git
passwd git` 

*   1
*   2
*   3
*   4
*   5
*   6
*   7
*   8
*   9
*   10
*   11
*   12

命令执行胜利后,测试成果应该如下:

Windows 通过安装包装置 Git

在 Git 官网下载地址,下载最新版本的 Git。装置实现后配置 Git 的环境变量。
Git 官网文档外面有阐明,谷歌 / 百度也能搜到很多教程,这里就不再赘述。
如果装置实现并配置好了 Git 的环境变量,鼠标右击后的菜单栏,能够看到 Git Bash Here 的选项,抉择后即可关上 git 的命令行工具。

在 Linux 服务器端创立 Git 仓库

`# 新建一个空白目录 blog.git,作为 Git 仓库
mkdir -p /home/gitrepo/blog.git
# 初始化仓库,--bare 示意只生成一个裸仓库,没有工作目录(.git), 会保留 git 历史提交的版本信息。git init --bare /home/gitrepo/blog.git
# 将该目录的所有人改为 git 用户
cd /home/gitrepo
chown -R git:git blog.git` 

*   1
*   2
*   3
*   4
*   5
*   6
*   7

Windows 客户端拉取近程仓库

在桌面通过Git Bash Here,关上 git 的命令行工具,进行如下测试:

`# 创立 e://test 目录,作为本地仓库
cd e:
mkdir test
cd test
# 克隆近程仓库
git clone git@47.96.86.36:/home/gitrepo/blog.git
# 这段命令的含意:以 git 用户的身份,拉取 ip 地址为 47.96.86.36 的主机上目录为 /home/gitrepo/blog.git 对应近程仓库治理的工作目录。这里要键入的明码就是 passwd git 命令为 git 用户设置的明码。` 

*   1
*   2
*   3
*   4
*   5
*   6
*   7

命令执行胜利后的效果图如下:

因为咱们这里刚刚初始化 Git 仓库 blog.git, 目前该 Git 仓库治理的工作目录中没有任何内容,所以克隆到客户端时,工作目录 blog 中没有任何内容。这里的.git 是暗藏目录,外面寄存的就是本地仓库对应的工作目录 blog 的版本信息。
这里须要留神的是:客户端的工作目录下新建文件,通过 git push origin master 命令推送到近程仓库后,近程仓库是看不到这些文件的。因为近程仓库初始化时设置了参数--bare,示意不会寄存源文件,只是寄存工作目录的版本信息。

设置免密

咱们每次从远端仓库拉取最新版本的我的项目,或从本地往远端推送新代码时,都须要验证明码。这样太麻烦了,Git 给咱们提供了一种办法来解决问题。

客户端生成公钥

`# 在客户端生成一对密钥(公钥和私钥)ssh-keygen -t rsa -C "zhenye@netopstec.com"` 

*   1
*   2

这个命令执行后,会在 ~/.ssh 门路即 user/.ssh 下生成如下文件,记录外面的公钥文件 id_rsa.pub 中的内容。效果图如下:

服务器端通过 RSA 认证实现免密

  • 新建寄存公钥的文件
`# 创立目录.ssh
mkdir /home/git/.ssh
# 给该目录授予权限 700
chmod 700 /home/git/.ssh
# 创立文件 authorized_keys
touch /home/git/.ssh/authorized_keys
# 给该文件授予权限 600
chmod 600 /home/git/.ssh/authorized_keys
# 因为权限设置问题(只有“文件所有人”能力操作),须要把把“文件所有人”更改为 git 用户
chown -R git:git  /home/git/.ssh/` 

*   1
*   2
*   3
*   4
*   5
*   6
*   7
*   8
*   9
*   10

阐明:git 用户的默认根目录是 /home/git,公钥默认是放在/home/git/.ssh/authorized_keys 文件外面。
这里须要留神的是每行放一个公钥。
因而这里就是将客户端生成的公钥放在该文件 authorized_keys 中。

  • 开启 RSA 认证
`vim /etc/ssh/sshd_config
# 批改 sshd_config 配置文件,把如下 3 个参数放开(如果没有相应参数须要自行添加)# RSAAuthentication yes
# PubkeyAuthentication yes
# AuthorizedKeysFile .ssh/authorized_keys

# 使该配置文件即时失效
systemctl restart sshd` 

*   1
*   2
*   3
*   4
*   5
*   6
*   7
*   8

此时,在客户端进行 push/pull 等等操作就都不须要输出明码了。

免密的原理阐明:

  • 在客户端执行命令ssh-keygen -t rsa -C "***.com",是通过 rsa 算法生成了一对密钥(一个公钥和一个密钥),因为这里是依据以后客户端的 ip 地址、以后工夫戳等等信息生成的,保障了数据的唯一性,这也就保障了用户认证的安全性。
  • 服务端开启了 RSA 认证后,把客户端的公钥保留在 authorized_keys 文件中,也就相当于客户端就是放在服务端的白名单中。每次客户端通过 git 操作来连贯服务端时,就会放行,而不须要明码认证。
退出移动版