引言
1. 起因
前段时间老板说代码要放到线下来,不让员工带走……
原本放在阿里云的代码管控平台,现在要放到本地的开发服务器上,恰逢阿里云的代码管控升级成云效平台,需要注册企业了,那就干脆所有项目进行迁移吧。
原先代码管控平台:阿里云的 https://code.aliyun.com
阿里云新升级的,云效平台(企业级别的,还有权限管控) https://codeup.aliyun.com
2. 概念
首先确定一些事情。
现在讨论的是服务端如何搭建git
的私有仓库。
客户端默认已经安装好git-bash
程序,关于客户端(Windows、Ios、Linux)如何安装git
,我这里就不再赘述。
服务端
这里的服务端,就是服务器
需要安装Git
代码仓库,我们这里安装的是一个只有命令行拉取的仓库,并没有安装可视化界面
不像github
或gitee
一样放了个“个人管理后台”
成员端
这里说的客户端、本地,指的是项目成员的本地电脑
需要收集成员的公钥,统一存放到服务端,用以管理成员信息。
什么时候适用于选用本博客提到的小仓库
如果你的成员较多,建议不要使用本篇博客提到的小型仓库,而是使用类似gitLab
之类的大型平台,带可视化界面的,便于运维人员和管理人员调整。
或者你如果对成员权限有着变态一般的要求,也可以使用Gitolite
这类的工具软件,可以对权限进行管控。
3. 配置
系统类型:Linux
系统版本:Centos7.2
服务端
git
版本:1.8.3.1远程仓库所在服务器的ip或域名:zyh.ivon.work
192.168.20.90
4. 传送门
如果你有相关基础,嗯,可以直接用这里的东西就行,更快
# --------------------------- 服务端篇 ----------------------------- #
# 获取git版本
git --version
# 安装git
sudo yum -y install git
# 查看git用户是否存在
cat /etc/passwd | grep git
# 创建不能登录的用户——git
sudo useradd git -s /usr/bin/git-shell
# 创建代码存放目录
mkdir /server/git_storage
# 建立裸仓库
git init --bare test.git
# 设置仓库属主
sudo chown -R git.git test.git/
# 设置整个目录权限
sudo chmod -R 700 /server/git_storage
# 创建.ssh文件夹,需要root权限
sudo mkdir /home/git/.ssh/
# 追加成员公钥(复制放进去)
sudo vim /home/git/.ssh/authorized_keys
# 查看权限
sudo ls -al /home/git/.ssh/authorized_keys
# 设置属主
sudo chown -R git.git /home/git/.ssh
# ----------------------------- 客户端篇 --------------------------- #
# 初始化本地git仓库(需要在项目路径下)
git init
# 将工作区里的所有文件都添加到暂存区(需要当前目录在项目根目录)
git add .
# 提交到版本库
git commit -m "xxx提交信息"
# 关联远程库
git remote add origin git@远程仓库主机地址:远程服务器上的仓库路径
# 查看关联情况
git remote -v
# 推送到远程库
git push -u origin master
一、【服务端】确认Git
应用安装情况
首先,确认服务器是否安装有git
环境,如果没有的话,后续都无法继续的。
如果你跟我一样,没安装的话,就需要去安装。
安装有很多种方式:源码安装、二进制包安装、还有我们本次使用的yum
安装,其他方式不是本次教程的重点,就不做介绍了。
源码编译git
使用yum
方式安装GIT
首先登录你的服务器,在服务端,使用yum
命令一键安装git
注意,当前执行的用户需要有root
权限,或拥有sudo
权限
sudo yum -y install git
输出git
版本
输出当前git的版本,确认git安装上了
二、【服务端】创建独特账号——git
我们使用git
的客户端(git-bash
)对远程服务器上的代码仓库进行拉取时,实际上是在登录了一个账号,用这个用户进行代码的克隆和传送,实际走的是SSH
协议(常规)。
1. 查看账号是否已经存在
首先使用命令查看是否存在名称为git
的用户
cat /etc/passwd | grep git
2. 创建一登录就掉线的账户
如果没有git
用户,我们可以进行创建
用户名:git
是否需要管理权:否
执行脚本:/usr/bin/git-shell
tip:我这里的/usr/bin/git-shell
是git
安装时附带的脚本命令,如果你是编译安装,那位置可能不在这个路径
这个用户使用git-shell
脚本的好处是,如果这个账号不幸被盗,攻击者登录Linux
系统时,会一登录进去就被掉出去,有一定的安全防范作用。
-s 参数用来指定登录脚本
执行命令新增用户:
sudo useradd git -s /usr/bin/git-shell
注意!这里不能用-M
参数,因为后续我们需要在git
用户的家目录下设置秘钥登录。
3. 再次查看账户是否存在
使用命令查看是否存在名称为git
的用户
cat /etc/passwd | grep git
查看到有这个用户
4. (不用执行)删除这个用户
如果建错了,可以删掉这个用户,重新建立,当然你也可以直接用usermod
命令修改。
删除用户命令:
sudo userdel -r git
三、【服务端】代码仓库存放确认
1. 建立存放目录
我们需要有一个位置来实际存放我们的远程仓库代码
比如我这里使用的是/server/git_storage
目录,没有的话,可以使用命令新建:
mkdir /server/git_storage
进到这个目录:cd /server/git_storage
2. 建立空仓库
我们常规初始化建立仓库,一般是在项目内,使用git init
命令来建立仓库,而服务端的远程仓库则有所不同。
我们需要在存放位置的根目录下,建立裸仓库(比如仓库名:test)
git init --bare test.git
这样,这个git
仓库的实际位置就是:
/server/git_storage/test.git
但要注意,这里是建立了一个空仓库,里头没有内容的,需要客户端进行推送才能有内容。
空仓库不代表文件夹内是空的,默认钩子都是正常创建的,只是单纯建立目录是不能起到远程仓库效果的
3. 确定仓库的属主
由于这个文件夹是需要到时候git
用户进行拉取和推送
所以需要将文件夹的属主设置为git
,组也设置为git
防止别人能够修改你的远程仓库信息,命令如下:
sudo chown -R git.git test.git/
注意:这里的改变 文件属主需要root
权限,常规用户无法修改
最好的话,用命令给整个仓库文件夹修改成仅git
用户访问就行,更安全一些,命令如下:
# 设置整个目录的所属者为git用户及其所属git组
sudo chown -R git.git /server/git_storage
# 设置整个目录的所属权限为所有者全部,其他人不给权限
sudo chmod -R 700 /server/git_storage
四、【客户端】仓库就绪
1. 创建本地仓库
如果你本地已经创建了Git
仓库,并且已经有提交,甚至已经有了远程仓库了,现在只是想迁移远程仓库,你可以跳过本节。
# 初始化本地git仓库(需要在项目路径下)
git init
# 将工作区里的所有文件都添加到暂存区(需要当前目录在项目根目录)
git add .
# 提交到版本库
git commit -m "xxx提交信息"
注意:我这里只是为了演示,实际使用中,最好还是不要一次性添加所有文件
2. 关联远程仓库
这里有两种情况,如果你像我上面一样,从初始化仓库开始的话,你就用新增关联就行,如果你已经设置过远程仓库,就需要修改关联信息。
新增关联
命令:
git remote add origin git@远程仓库主机地址:远程服务器上的仓库路径
解释一下具体参数值:
git remote add
是新增关联的固定语法origin
是你定义的远程仓库名(默认一般填这个)git
是你创建的服务端账号名(可修改)
修改关联
命令大体相同,主要是把add
改为set-url
git remote set-url origin git@远程仓库主机地址:远程服务器上的仓库路径
查看关联情况
使用命令:
git remote -v
查看本地的这个仓库对应的所有远程仓库绑定情况。
这里会有两条记录生成,因为一般git
都有推送和拉取的两种操作,你也可以分开来设置推送拉取地址,这个细节我这里就不赘述了。
3. 无密码推送远程仓库(失败)
当我们上述操作完成,成功绑定后,开始推送远程仓库(推送刚刚提交到版本库的那个“初始化提交”版本)
我们这里由于远程仓库是空的,本地的分支跟远程分支并没有建立关联,所以需要加入-u
参数,表示去建立关联。
注意,现在本地分支也是处于master
分支下。
下面这句命令的意义为:将当前的master
分支,推送到名为origin
的远程仓库的master
分支上,如果远端没有master
分支,默认创建并建立关联。
git push -u origin master
这里提示需要输入密码,有两种解决方式:
- 有密码推送:需要在服务端给
git
用户设置密码,然后每次推送的时候输入 - 无密码推送:跟着做下述配置
4. 拿到本机公钥
需要先拿到你本机的公钥,将本机公钥发送到远程服务器git
用户的家目录下的特定文件内
注意,这里的执行需要在git-bash
命令行下,或者你自己找到你本机的公钥文件,用记事本或编辑器打开复制也可以。
# 查看你本机的秘钥信息
cat ~/.ssh/id_rsa.pub
如上图所示,已经输出当前公钥信息,需要你把这个公钥信息复制下来,后续用得到。
五、【服务端】添加远程仓库人员信息
1. 创建authorized_keys
文件
默认git
用户家目录下是没有.ssh
文件夹的,需要我们手动建立
使用命令:
# 创建.ssh文件夹,需要root权限
sudo mkdir /home/git/.ssh/
2. 收集成员公钥并放入
然后创建authorized_keys
文件
并放入刚刚复制下来的公钥(第一个成员当然是自己)
输入命令:
sudo vim /home/git/.ssh/authorized_keys
输入i
,进行编辑
这时候输入完成,按下Esc
键,左下角的“插入”文字消失
输入wq!
保存并退出
tip:如果你一直无法保存退出,请检查当前输入法大小写
后续其他成员的公钥也是这样放进来
3. 确认authorized_keys
文件权限
可以查看一下这个文件的权限信息,使用命令:
-a
参数代表可查看隐藏文件,-l
参数代表列出详细信息
sudo ls -al /home/git/.ssh/authorized_keys
发现权限不对,这里是root
权限,git
用户登录时无法访问
需要修改权限属主信息,使用命令:
sudo chown -R git.git /home/git/.ssh
六、【客户端】尝试推送成功
再试试客户端进行推送
推送成功,如果要推送其他分支,操作也是一样
相关资料参考和引用
这里我非常感谢廖雪峰老师的教程,深入浅出的讲解了git
的知识,这些知识给我这篇文章提供了非常大的帮助。
如果有时间,我非常推荐大家看一下廖雪峰老师的相关教程,受益良多!
链接如下: