gitlab基础使用
设置语言
gitlab社区版同样支持直接配置为简体中文,可能适配率暂不支持100% 。
点击头像,Preferences——>Preferences——>Localization 。
Language设置为简体中文,save changes。
使用介绍
gitlab的基础应用主要包括项目创建、组管理、issue等功能。
存放代码是最基本和重要的功能。
创建组及项目
群组——>新建群组 。
可选择create group 或者直接 import group 。
通常对于企业内部或组织私用,建议采用 Private 权限。
组可以跨多个项目进行管理和协作,一个组的成员可以访问改组下的所有项目,同时还可以创建子组进行嵌套。
private:该类型组及其项目只能由成员查看。
internal:除外部用户外,任何登录用户都可以查看组和任何内部项目。
public:任何公共项目都可以在没有任何认证的情况下查看。
继续完成项目创建,新建项目 。
通常可以创建一个空白项目,用来存储文件、工作内容、代码等。
也可以从一个模板创建创建一个项目,模板预设了必要文件等。
同时也支持从github、bitbucket或其他gitlaba外部导入项目。
创建空白项目:
创建一个名为 myapp 的项目。
必须明确地将项目访问权限授予每个用户,如果此项目是组的一部分,则将访问权限授予该组的成员。
提示:项目名称必须以小写或大写字母、数字或下划线开头。
PrivateProject访问必须显式授予每个用户。
如果此项目是组的一部分,则将访问权限授予该组的成员。
如下,创建已完成。
gitlab分支管理
gitlab代码分支管理包括分支创建、设置等,通常新建仓库后,默认创建一个master/main分支,按照产品研发的需求,通常不允许代码直接提交到master分支,而是根据业务特点和要求,创建多个分支。
通常根据不同的场景,会创建 dev 分支,即开发分支。
在当前 myapp ——> 当前仓库 ——> 新建分支 。
创建一个 dev 分支,新建的 dev 分支来自于 main 。
创建完后,打开项目即能看到新创建的 dev 分支。
分支删除可在 代码 ——> 分支中进行删除。
对于分支的权限管理,在 设置 ——> 仓库 中。
默认分支:此配置可以设置项目的默认分支,并配置分支名称模板。通常项目的默认分支是 main ,即打开项目通常直接显示的就是 main 分支。
镜像仓库:将项目设置为自动向另一个仓库推送,或者自动从另一个仓库拉取。其中分支、标签和提交将自动同步。
分支规则:此配置可以定义谁push、merge以及每个分支所需的审批规则。
受保护分支:保持稳定分支的安全性,并强制开发人员使用合并请求。如下设置 main 为保护分支,并且设置只有管理员( maintainer )有权限进行 merge 和 push 。
保护标签:限制创建和更新标签的访问权限。
部署令牌:部署令牌允许访问packages、repository和registry images镜像。
部署秘钥:添加部署密钥以授予此仓库的读/写访问权限。
仓库维护:管理仓库存储和清理。
分支管理模型
如下为一个可以参考的实践:
- 首先从 main 分支拉出 dev 分支,开发者在 dev 分支上进行开发。且一般不允许开发直接 push 到 dev 分支,而是将代码仓 fork 到自己的私有仓库中,然后通过 mergerequest 的方式向 dev 分支提交代码。部署流水线CI部署在 dev 分支。每次 dev 分支的提交需要做一些静态代码检查、单元测试、编译等。
- 待小周期开发结束,将 dev 分支合入到 test 分支,test 分支用于部署到测试环境供测试人员测试,待测试人员经过充分测试后再合入 pre 分支,用于部署到预发布环境,供相关人员体验。
- 正式发布一个版本,如 1.0 ,同时将代码合入 main 分支,同时拉出 1.0 分支,此分支用于后续维护。
- 此后开发人员继续下一个小周期的开发,代码继续合入 dev 。
当前主流的分支管理模型有:
- Git flow
- GitHub flow
- GitLab flow
- TBD flow
对于具体模型的更多知识可参考: 团队如何选择合适的Git分支策略 一图看懂各种分支管理模型
gitlab官方给出如下建议遵循的十一条建议:
- 使用特性(feature)分支而不是直接在主分支(main/master)上进行提交。
- 测试所有的提交,而不仅仅是主分支上的提交。
- 对每个提交运行所有测试。
- 在将代码合并到主分支之前进行Code Review。
- 部署是基于分支或标签的自动化。
- 标签由用户手动设置,而不是由持续集成(CI)自动设置。
- 基于标签进行发布。
- 已经推送的提交应该从不进行rebase。
- 始于主分支(main/master),止于主分支。
- 首先在主分支中修复bug,然后在发布分支中修复。
- 提交消息应该反映出意图。
本实验更倾向具体的基础使用,对于具体模型不做过多探讨。
需求任务管理
gitlab主要通过 issue 来管理需求任务和缺陷故障,对于gitlab而言,需求、任务、缺陷都是 issue 。
而 gitlab 通过标签来标记 issue 到底属于哪个类型。
因此建议在使用 issue 之前对标签 lable 进行规划设计。
同时gitlab还提供里程碑的概念,即在开发过程中,可以设置若干里程碑作为软件研发过程中的关键节点。
里程碑创建
计划 ——> 里程碑 ,新建里程碑 。
如下所示,将 v1.0 版本的发布当做里程碑进行创建。
要求 app 能正常上线,且具备主要功能,时间为一个季度内。
针对该里程碑已创建完成。
标签设计及新增
- 标签设计
issue 最基础的要覆盖需求、任务、缺陷等,此外通常还需要包括协作讨论的内容,以及参考文档等。
从功能层面,标记可以设计5个,如 feature 、 task 、 bug 、 discussion 、 doc 。
根据问题缺陷的严重程度,标记可以设计4个,如 blocker 、 critical 、major 、 trivial 。
根据问题缺陷的优先程度,标记可以设计5个,如 immediate 、 urgent 、 hight 、normal 、 low 。
通常如上设计基本可以覆盖大多数场景,也可以根据实际项目情况,进行其他设计。
- 标签新增
管理 ——> 标记 。
分别创建不用的标记。
查看所创建的标记。
issue提交
通过提交issue,进行需求、任务等跟进。
设置标题、描述、需求指派,并关联关键里程碑,也可指定多个标签,如 feature 、 hight ,即较高需求。
确认创建完成。
创建任务和创建缺陷流程可参考创建feature的过程。
gitlab连接管理
git客户端通常用来连接gitlab服务端,支持ssh和https协议。
配置ssh公钥
常见的gitlab、github、gitee等,注册账号后都支持配置sh公钥,通过ssh公钥下载、更新或者上传代码都不再需要输入密码。
- Windows生成公钥
Windows的cmd或PS里执行:ssh-keygen.exe -t rsa -C "x120952576@126.com"
公钥位于: C:\Users${USERNAME}.ssh\id_rsa.pub
- Linux生成公钥
[root@gitclient ~]# ssh-keygen -f ~/.ssh/id_rsa -N '' -b 4096 -C "x120952576@126.com"[root@gitclient ~]# cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCzR7OdAO6GUa6jOg4dDAKApoHfwyJLOApdH9UeRbgUlm2WsW+cbdXCHpMHf7zTD122zcnThnvt6eayc8mmHSSgDm5XhWLFoD25kGedpPvmz0ZmEF32Inx2Ysh0+wqO1Z/Zvl4COwYrtexiLhpaCdWjpvDWP/B6g9zh+yDT9B2c6fl0EeFsXzfz2I1Axw/QBiarWP81FeYCQxdNsELd3qbeIOpu/KHgi71N7k61Ogw4W2v5Sl7KwQoJSsLg+WxJ2USURqyEvVOZrETXbFUHAlEQ7PxdKGc2tctv83Z5/e5xAGSdef6exPQ8bRCa8lYgvuKWqpt8noMM22C6EGYYzLsaB1mcqwgEqgrbHbjC/O7CMzBoCJvR1LaV4iFyUFDMAa/HMJBSxqrYJcEydTfAtUtbfYoi1KEjrAlXovjGR9WABdFTbuOf4+WO1rjtW7iuoqWS1uaPrItf1kQcTQl/mybW0XJJemCZDBYEIiHJYLill7LpPeFWbRw0Xt9ob0Y3ts8ghNcTYScKxBgl3HoM5Jr69pDYrV1uAjVSAasU/5u+r9TJlGkri3wqfrkMKu0kfdA+eAY4znhzM+Alx4ZTymvCLwVIzu4qlDU5q+gJBBbk+Jn98o1F6yw/HM3RdkoYgNm7TJGgCVKbK7+4azMXLnA89/2ZK5ahggMf3/fO0h+6zQ== x120952576@126.com
公钥位于: /root/.ssh/id_rsa.pub
- 配置公钥
点击头像,偏好设置 。
SSH 秘钥,然后 添加新秘钥。
将生成的公钥内容复制到Key中。
确认添加完成。
SSH公钥测试
配置好SSH key后,可以通过ssh协议的git地址进行代码管理。
首页进入 myapp 项目后,代码下拉,复制ssh地址。
- ssh非标准端口配置
由于服务端采用的helm 在Kubernetes中部署的gitlab,ssh协议是和mygitlab-gitlab-shell Pod通信,该Pod使用nodeport暴露出来的。
所有节点的默认22端口被节点自身的ssh服务占用,因此采用 32222 进行暴露。
所以客户端使用git clone的时候建议在ssh config里将非标准端口提前配置。
[root@gitclient ~]# ssh -Tv git@gitlab.linuxsb.com -p 32222 #连接测试[root@gitclient ~]# cat >> .ssh/config << EOF
Host gitlab.linuxsb.comHostName gitlab.linuxsb.comPort 32222User gitIdentityFile ~/.ssh/id_rsaIdentitiesOnly yes
EOF
ssh协议git测试:
[root@gitclient ~]# git clone git@gitlab.linuxsb.com:mygroup/myapp.git
Cloning into 'myapp'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
Receiving objects: 100% (3/3), done.
HTTPS协议配置
对应https协议的方式,通常每次连接(clone、pull、push等)都需要输入用户名和密码。
通常可以使用如下几种方式配置,省去每次都需要输入用户名和密码。
- 启用匿名clone
通常对于企业内部或者私有环境,不建议启用匿名clone 。
若需要开放可如下操作:
修改 values.yaml,然后更新upgrade。
global:gitlab:projectFeatures:publicProjects: true # 允许公开项目匿名访问
或者进入 GitLab 网页端:
项目 设置 ——> 通用 ——> 可见性 ——> 项目可见性 ,调整为 Public 。
- 缓存令牌
缓存令牌是指在客户端将输入的用户名和密码临时缓存一段时间,从而克隆时只需输入一次凭证。
git config --global credential.helper 'cache --timeout 3600'
- 个人Token(推荐)
代替密码,生成一个具有适当权限的访问令牌,并将其存储在Git配置中。
头像 ——> 偏好设置 ——> 访问令牌,个人访问令牌,添加新令牌。
输入 Token 名称:mytoken01
勾选权限:api、read_repository、write_repository等。
有效期:根据需求设置。
点击 创建个人令牌,保存生成的 Token。
复制生成的令牌,如 glpat--Hzu91s1N3PymHS3H2WK 。
客户端添加该令牌:
如下进行全局配置,即所有仓库生效。
[root@gitclient ~]# git config --global credential.helper store #长期保存凭证
git clone https://oauth2:glpat--Hzu91s1N3PymHS3H2WK@gitlab.linuxsb.com/mygroup/myapp.git
[root@gitclient ~]# git clone https://oauth2:glpat--Hzu91s1N3PymHS3H2WK@gitlab.linuxsb.com/mygroup/myapp.git #针对特定仓库
Cloning into 'myapp'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
Unpacking objects: 100% (3/3), 2.77 KiB | 2.77 MiB/s, done.
git客户端配置
git客户端还需要配置邮箱和用户名。
Git允许在全局或单个仓库中配置用户名和邮箱。全局配置适用于所有仓库,而本地配置仅对当前仓库有效。
[root@gitclient myapp]# git config --global user.email "x120952576@126.com"
[root@gitclient myapp]# git config --global user.name "xhy"
[root@gitclient myapp]# git config --list | grep -E 'user.name|user.email'
user.email=x120952576@126.com
user.name=xhy
提示:若不同仓库身份不同,则可以如下单独仓库里设置邮箱和用户名。
cd /root/myapp
git config user.email "x120952576@126.com"
git config user.name "xhy"
git基础使用
git客户端安装
git简介与安装参考: Git简介与安装 。
Windows与Linux安装包可在官方进行下载: https://git-scm.com/downloads 。
Windows安装略,Linux安装参考如下:
- 编译安装
[root@gitclient ~]# yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel asciidoc xmlto docbook2x[root@gitclient ~]# wget https://www.kernel.org/pub/software/scm/git/git-2.48.1.tar.xz
[root@gitclient ~]# tar -zxf git-2.48.1.tar.gz
[root@gitclient ~]# cd git-2.48.1
[root@gitclient git-2.48.1]# make configure
[root@gitclient git-2.48.1# ./configure --prefix=/usr/local/git
[root@gitclient git-2.48.1]# make all doc info
[root@gitclient git-2.48.1]# sudo make install install-doc install-html install-info
[root@gitclient git-2.48.1]# echo 'export PATH=$PATH:/usr/local/git/bin' >> /etc/profile.d/custom_path.sh[root@gitclient ~]# git version #确认版本
- yum安装
对于yum安装,可直接执行如下命令:
[root@gitclient ~]# yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel asciidoc xmlto docbook2x
[root@gitclient ~]# yum -y install git[root@gitclient ~]# git version #确认版本
git配置
git客户的配置文件主要有如下几类:
-
/etc/gitconfig :针对全局的通用配置,可使用git config --system配置;
-
~/.gitconfig 或 ~/.config/git/config :针对当前用户生效的配置,可使用git config --global配置;
-
当前仓库目录 .git/config :针对该仓库。
-
配置示例
配置用户信息:
[root@gitclient ~]# git config --global user.name "zhangsan"
[root@gitclient ~]# git config --global user.email "xhy@itzgr.com"
- 查看配置信息
[root@gitclient ~]# git config --list
http.sslcainfo=/etc/pki/ca-trust/source/anchors/myCA.crt
http.sslverify=true
credential.helper=store[root@gitclient ~]# git config http.sslcainfo #查看具体某一项配置信息
/etc/pki/ca-trust/source/anchors/myCA.crt
git基础使用
- 克隆代码
git clone可以克隆远程仓库代码,支持SSH协议和HTTPS协议。
git支持如下四种方式的URL,以 gitlab.linuxsb.com 举例,该gitlab部署在Kubernetes中,其中gitlab-shell通过nodeport 32222端口暴露,gitlab-webservice通过ingress 443端口暴露。
git clone默认使用SSH协议,即在不指定特定协议的时候,默认采用ssh协议。
示例一:隐式使用了SSH协议,且通过~/.ssh/config下的32222端口连接,该URL为gitlab图形界面中提供的地址。
也可以显式的指定ssh协议及端口。
[root@gitclient ~]# git clone git@gitlab.linuxsb.com:mygroup/myapp.git
[root@gitclient ~]# git clone ssh://git@gitlab.linuxsb.com:32222/mygroup/myapp.git
[root@gitclient ~]# git clone ssh://git@gitlab.linuxsb.com/mygroup/myapp.git
示例二:显式的使用https协议。
[root@gitclient ~]# git clone https://gitlab.linuxsb.com/mygroup/myapp.git
Cloning into 'myapp'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
Unpacking objects: 100% (3/3), 2.77 KiB | 1.39 MiB/s, done.
- 查看状态
进入代码仓根目录,可以通过git status查看当前代码仓的状态。
本地追加一个文件后,再次查看状态。
[root@gitclient ~]# cd myapp/
[root@gitclient myapp]# git status
On branch main
Your branch is up to date with 'origin/main'.nothing to commit, working tree clean
如上表明当前在 main 分支,没有任何修改。
- 添加新文件
新增文件默认都是untrack,即没有任何记录、没有任何跟踪,也不参与版本控制。
[root@gitclient myapp]# echo "Hello World!" > test.txt
[root@gitclient myapp]# git status
On branch main
Your branch is up to date with 'origin/main'.Untracked files:(use "git add <file>..." to include in what will be committed)test.txtnothing added to commit but untracked files present (use "git add" to track)
提示:Untracked files:未跟踪文件列表,即之前快照(提交)中没有此文件,git默认不会自动纳入跟踪范围。
- 跟踪新文件
staged可以理解成暂存。也就是说我们把所有的改动都记录下来了,进行跟踪,如下表示在git系统当中记录的已经是这个文件最新的状态了。
当我们添加了新的文件,或者是有了新的改动,执行git add之后,得到的状态就是staged。
再次执行git status,能获取当前创建和更新了哪些文件。
[root@gitclient myapp]# git add . #当前所有修改进行跟踪
[root@gitclient myapp]# git add test.txt #跟踪特定文件[root@gitclient myapp]# git status
On branch main
Your branch is up to date with 'origin/main'.Changes to be committed:(use "git restore --staged <file>..." to unstage)new file: test.txt
提示:Changes to be committed:已暂存状态的文件。staged只是暂存,还没有真正提交进git系统当中。
- 修改文件
针对已经记录/跟踪的文件又进行了修改,也就是改动了某个之前已经记录的文件,那么再次查看状态的时候就是modified,表示改动了,之前的记录已经不是最新的了,可以进行更新或者撤销修改。
[root@gitclient myapp]# echo -e "\nThis is my first git file!" >> test.txt #修改文件内容[root@gitclient myapp]# git status #再次查看状态
On branch main
Your branch is up to date with 'origin/main'.Changes to be committed:(use "git restore --staged <file>..." to unstage)new file: test.txtChanges not staged for commit:(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)modified: test.txt[root@gitclient myapp]# git diff test.txt
diff --git a/test.txt b/test.txt
index 980a0d5..ab46dd7 100644
--- a/test.txt
+++ b/test.txt
@@ -1 +1,3 @@Hello World!
+
+This is my first git file!
- 提交内容
使用git commit进行提交文件,本质是将文件的修改提交到本地仓库。
-m 参数用于描述本次提交的备注,便于后期排查。
对于再次修改的文件,可使用add,再次添加,然后进行提交。
[root@gitclient myapp]# git add test.txt
[root@gitclient myapp]# git status
On branch main
Your branch is up to date with 'origin/main'.Changes to be committed:(use "git restore --staged <file>..." to unstage)new file: test.txt[root@gitclient myapp]# git commit -m "commit my test.txt"
[main 284a2d9] commit my test.txt1 file changed, 3 insertions(+)create mode 100644 test.txt[root@gitclient myapp]# git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.(use "git push" to publish your local commits)nothing to commit, working tree clean
提示:committed表示已将暂存的staged状态的文件已提交,经过git commit命令之后,所有被提交的文件的状态就是committed。
默认git只会将所有暂存区的文件进行提交,但可通过git commit -a选项,git会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤。
- push内容
将已commit的内容通过push提交到远程仓库。
[root@gitclient myapp]# git push origin main
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 308 bytes | 308.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To ssh://gitlab.linuxsb.com:32222/mygroup/myapp.git57df420..284a2d9 main -> main
在图形界面gitlab中查看文件提交结果。
- 总结常用命令
git init:在当前目录新建一个Git代码库,即初始化为git代码库。
git clone:克隆一个项目和它的整个代码历史。
git status [filename]:查看指定文件状态。
git status:查看所有文件状态。
git add [file1] [file2] ... :添加指定文件到暂存区
git add [dir]:添加指定目录到暂存区,包括子目录。
git add . :添加当前目录的所有文件到暂存区。
git reset:如果已经用add 命令把文件加入stage了,則表示从stage中撤销。
git clean:移除所有未跟踪文件,参数-df表示包括目录和强制清除。
git rm --cached:从stage中删除,保留物理文件。
git rm:从stage中删除,同时删除物理文件。
git diff:查看文件修改后的差异。
git diff --cached:比较暂存区的文件与之前已经提交过的文件。
git分支管理
- 查看分支
查看当前所处的分支。
[root@gitclient myapp]# git branch
* main
查看本地和远端的所有分支。
[root@gitclient myapp]# git branch -a
* mainremotes/origin/HEAD -> origin/mainremotes/origin/devremotes/origin/main
- 新建分支
可以在图形界面,也可以通过git命令创建分支。
如下创建同时切换至新分支。
[root@gitclient myapp]# git checkout -b test
Switched to a new branch 'test'
[root@gitclient myapp]# git branchmain
* test[root@gitclient myapp]# ls
README.md test.txt[root@gitclient myapp]# git checkout main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.
[root@gitclient myapp]# git branch
* maintest
提示:git checkout表示切换到当前已存在的分支;git checkout -b表示如果需要切换的分支不存在则以当前所处分支为根基新建对应分支。
- 推送分支
可以将本地创建的分支,push到远端仓库。
[root@gitclient myapp]# git checkout test
Switched to branch 'test'
[root@gitclient myapp]# git branch main
* test[root@gitclient myapp]# git push origin test
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote:
remote: To create a merge request for test, visit:
remote: https://gitlab.linuxsb.com/mygroup/myapp/-/merge_requests/new?merge_request%5Bsource_branch%5D=test
remote:
To ssh://gitlab.linuxsb.com:32222/mygroup/myapp.git* [new branch] test -> test
本地分支和远端分支相关流程如参考:
提示:更多的git日常基础参考: 002.Git日常基础使用 。