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