引言

1. 起因

前段时间老板说代码要放到线下来,不让员工带走……

原本放在阿里云的代码管控平台,现在要放到本地的开发服务器上,恰逢阿里云的代码管控升级成云效平台,需要注册企业了,那就干脆所有项目进行迁移吧。

原先代码管控平台:阿里云的 https://code.aliyun.com

阿里云新升级的,云效平台(企业级别的,还有权限管控) https://codeup.aliyun.com

2. 概念

首先确定一些事情。

现在讨论的是服务端如何搭建git的私有仓库。

客户端默认已经安装好git-bash程序,关于客户端(Windows、Ios、Linux)如何安装git,我这里就不再赘述。

服务端

这里的服务端,就是服务器

需要安装Git代码仓库,我们这里安装的是一个只有命令行拉取的仓库,并没有安装可视化界面

不像githubgitee一样放了个“个人管理后台”

成员端

这里说的客户端、本地,指的是项目成员的本地电脑

需要收集成员的公钥,统一存放到服务端,用以管理成员信息。

什么时候适用于选用本博客提到的小仓库

如果你的成员较多,建议不要使用本篇博客提到的小型仓库,而是使用类似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环境,如果没有的话,后续都无法继续的。

输出当前git版本(没有安装)

如果你跟我一样,没安装的话,就需要去安装。

安装有很多种方式:源码安装、二进制包安装、还有我们本次使用的yum安装,其他方式不是本次教程的重点,就不做介绍了。

源码编译git

使用yum方式安装GIT

首先登录你的服务器,在服务端,使用yum命令一键安装git

注意,当前执行的用户需要有root权限,或拥有sudo权限

sudo yum -y install git

yum安装git

输出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-shellgit安装时附带的脚本命令,如果你是编译安装,那位置可能不在这个路径

这个用户使用git-shell脚本的好处是,如果这个账号不幸被盗,攻击者登录Linux系统时,会一登录进去就被掉出去,有一定的安全防范作用。

-s 参数用来指定登录脚本

执行命令新增用户:

sudo useradd git -s /usr/bin/git-shell

注意!这里不能用-M参数,因为后续我们需要在git用户的家目录下设置秘钥登录。

3. 再次查看账户是否存在

使用命令查看是否存在名称为git的用户

cat /etc/passwd | grep git

查看到有这个用户

存在用户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@远程仓库主机地址:远程服务器上的仓库路径

解释一下具体参数值:

  1. git remote add是新增关联的固定语法
  2. origin是你定义的远程仓库名(默认一般填这个)
  3. 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

需要输入密码

这里提示需要输入密码,有两种解决方式:

  1. 有密码推送:需要在服务端给git用户设置密码,然后每次推送的时候输入
  2. 无密码推送:跟着做下述配置

4. 拿到本机公钥

需要先拿到你本机的公钥,将本机公钥发送到远程服务器git用户的家目录下的特定文件内

注意,这里的执行需要在git-bash命令行下,或者你自己找到你本机的公钥文件,用记事本或编辑器打开复制也可以。

# 查看你本机的秘钥信息
cat ~/.ssh/id_rsa.pub

查看本机秘钥

如上图所示,已经输出当前公钥信息,需要你把这个公钥信息复制下来,后续用得到。

五、【服务端】添加远程仓库人员信息

1. 创建authorized_keys文件

默认git用户家目录下是没有.ssh文件夹的,需要我们手动建立

没有.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

authorized_keys文件权限不正确

发现权限不对,这里是root权限,git用户登录时无法访问

需要修改权限属主信息,使用命令:

sudo chown -R git.git /home/git/.ssh

修改属主成功

六、【客户端】尝试推送成功

再试试客户端进行推送

客户端推送代码成功

推送成功,如果要推送其他分支,操作也是一样

相关资料参考和引用

这里我非常感谢廖雪峰老师的教程,深入浅出的讲解了git的知识,这些知识给我这篇文章提供了非常大的帮助。

如果有时间,我非常推荐大家看一下廖雪峰老师的相关教程,受益良多!

链接如下:

https://www.liaoxuefeng.com/wiki/896043488029600


欢迎关注拓行公众号,分享各种技术博客文章

拓行——奋勇进取,开拓未来,砥砺前行

最后修改:2024 年 04 月 09 日
如果您对各种技术博客文章感兴趣,欢迎关注拓行公众号,分享各种专业技术知识~