当前位置: 首页 > news >正文

Git详解及 github与gitlab使用

目录

1.1 关于版本控制

1.1.1 本地版本控制

1.1.2 集中化的版本控制系统

1.1.3 分布式版本控制系统

1.2 Git简介

1.2.1 Git历史

1.3 安装git

1.3.1 环境说明

1.3.2 Yum安装Git

1.3.3 编译安装

1.4 初次运行 Git 前的配置

1.4.1 配置git

1.4.2 获取帮助

1.5 获取 Git 仓库(初始化仓库)

1.5.1 创建裸库

1.5.2 创建本地库

1.6 Git命令常规操作

1.6.1 创建文件

1.6.2 添加新文件

1.6.3 删除git内的文件

1.6.4 重命名暂存区数据

1.6.5 查看历史记录

1.6.6 还原历史数据

1.6.7 还原未来数据

1.6.8 标签使用

1.6.9 对比数据

1.7 分支结构

1.7.1 分支切换

1.7.2 合并失败解决

1.7.3 删除分支

1.9 gitlab的使用

1.9.1 安装配置gitlab

1.9.2 使用浏览器访问,进行web界面操作

1.9.3 gitlab 命令行修改密码

1.9.4 gitlab服务管理

1.9.5 公司的开发代码提交处理流程

1.9.6 Gitlab 备份与恢复

1、查看系统版本和软件版本

2、数据备份

3、测试数据恢复

(1) 安装部署 gitlab server

(2) 恢复 gitlab

1.9.7 邮箱配置


1.1 关于版本控制

开始之前先看一个没有版本控制的例子

1.1.1 本地版本控制

本地版本控制系统许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。这么做唯一的 好处就是简单,但是特别容易犯错。有时候会混淆所在的工作目录,一不小心会写错文件或者覆盖意想外的文件。

1.1.2 集中化的版本控制系统

如何让在不同系统上的开发者协同工作?于是,集中化的版本控制系统(Centralized Version Control Systems,简称 CVCS)应运而生。这类系统,诸如 CVS、Subversion 以及Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法。

1190037-20171130170717667-909081145.png

1.1.3 分布式版本控制系统

在这类系统中,像Git、Mercurial、Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。

1190037-20171130170739729-1366084886.png

1.2 Git简介

1190037-20171130170749808-269525315.png

官网:Git

git是一个分布式版本控制软件,最初由林纳斯·托瓦兹(Linus Torvalds)创作,于2005年以GPL发布。最初目的是为更好地管理Linux内核开发而设计。

Git 官方中文手册 Git - Book

1.2.1 Git历史

自2002年开始,林纳斯·托瓦兹决定使用BitKeeper作为Linux内核主要的版本控制系统用以维护代码。因为BitKeeper为专有软件,这个决定在社区中长期遭受质疑。在Linux社区中,特别是理查德·斯托曼与自由软件基金会的成员,主张应该使用开放源代码的软件来作为Linux核心的版本控制系统。林纳斯·托瓦兹曾考虑过采用现成软件作为版本控制系统(例如Monotone),但这些软件都存在一些问题,特别是性能不佳。现成的方案,如CVS的架构,受到林纳斯·托瓦兹的批评。

2005年,安德鲁·垂鸠写了一个简单程序,可以连接BitKeeper的存储库,BitKeeper著作权拥有者拉里·麦沃伊认为安德鲁·垂鸠对BitKeeper内部使用的协议进行逆向工程,决定收回无偿使用BitKeeper的授权。Linux内核开发团队与BitMover公司进行蹉商,但无法解决他们之间的歧见。林纳斯·托瓦兹决定自行开发版本控制系统替代BitKeeper,以十天的时间,编写出第一个git版本

1.3 安装git

1.3.1 环境说明

 [root@git ~]# rpm -qa centos-releasecentos-release-7-4.1708.el7.centos.x86_64[root@git ~]# uname -aLinux gitlab 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux[root@git ~]# getenforce Disabled[root@git ~]# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)Active: inactive (dead)Docs: man:firewalld(1)

本文使用的linux系统均为该系统

本文使用的windows系统为 Microsoft Windows [版本 10.0.15063]

1.3.2 Yum安装Git

centos 自带git

[root@git ~]# rpm -qa gitgit-1.8.3.1-11.el7.x86_64

安装方法

[root@git ~]# yum install git -y

1.3.3 编译安装

编译安装可以安装较新版本的git

Git下载地址: Releases · git/git · GitHub

 # 安装依赖关系[root@git ~]# yum install curl-devel expat-devel gettext-devel  openssl-devel zlib-devel autoconf gcc perl-ExtUtils-MakeMaker# 编译安装 [root@git ~]# tar -zxf git-2.0.0.tar.gz[root@git ~]# cd git-2.0.0[root@git ~]# ./configure --prefix=/usr/local/git # 没有文件可以略过[root@git ~]# make  [root@git ~]# make install  

1.4 初次运行 Git 前的配置

1.4.1 配置git

命令集

 git config --global user.name "username"  #配置git使用用户git config --global user.email "email@mail.com"  #配置git使用邮箱git config --global color.ui true  #语法高亮git config --list # 查看全局配置

配置过程

 [root@gitlab ~]# git config --global user.name "newrain"  #配置git使用用户[root@gitlab ~]# git config --global user.email "newrain@aliyun.com"  #配置git使用邮箱[root@gitlab ~]# git config --global color.ui true  #语法高亮[root@gitlab ~]# git config --list # 查看全局配置user.name=newrainuser.mail=newrain@aliyun.comcolor.ui=true

生成的配置文件

 [root@gitlab ~]# cd[root@gitlab ~]# cat .gitconfig [user]name = newrainemail = newrain@aliyun.com[color]ui = true

1.4.2 获取帮助

使用Git时需要获取帮助,有三种方法可以找到Git命令的使用手册:

 git help <verb>git <verb> --helpman git-<verb>

例如,要想获得配置命令的手册,执行

 git help config

1.5 获取 Git 仓库(初始化仓库)

1.5.1 创建裸库

 [root@gitlab ~]# useradd git[root@gitlab ~]# passwd git[root@gitlab ~]# mkdir /git-root/[root@gitlab ~]# cd /git-root/[root@gitlab git-root]# git init --bare shell.gitInitialized empty Git repository in /git-root/shell.git/[root@gitlab git-root]# chown -R git:git shell.git

1.5.2 创建本地库

[root@gitlab opt]# ssh-keygen[root@gitlab opt]# ssh-copy-id git@192.168.249.156[root@gitlab opt]# git clone git@192.168.249.156:/git-root/shell.git[root@gitlab opt]# lsrh  shell[root@gitlab opt]# cd shell/[root@gitlab shell]# vim test1.sh[root@gitlab shell]# git add test1.sh[root@gitlab shell]# git commit -m 'first commit'[master (root-commit) 33c5fbf] first commit1 file changed, 2 insertions(+)create mode 100644 test1.sh[root@gitlab shell]# git push origin masterCounting objects: 3, done.Writing objects: 100% (3/3), 230 bytes | 0 bytes/s, done.Total 3 (delta 0), reused 0 (delta 0)To git@192.168.1.102:/git-root/shell.git* [new branch]      master -> master[root@gitlab shell]# [root@git objects]# tree.├── 5d│   └── 0921ada98b7d356699974ca580a3a54dd95590├── 70│   └── 8232789ba22b76030c944bea934bfc23da9c3d├── a0│   ├── 8d7672007b588ed57414127b845e410eed3af0│   └── d08fd1a09409e5bba8cc8d079b47ec92e4d4b1├── a1│   └── 06dd26e56429e9bc2d624f748b88ce3462dec8├── bd│   └── 133c756c8cd6f3c17e49afdb4999a5bbc02c0e├── info└── pack​
 #显示文件内容
 [root@git objects]# git cat-file -p  5d0921adajunjiezhenshuai
 # 显示文件类型
 [root@git objects]# git cat-file -t  5d0921adablob
 # 显示文件大小
 [root@git objects]# git cat-file -s  5d0921ada16
 

1.6 Git命令常规操作

常用命令说明

命令命令说明
#add添加文件内容至索引
bisect通过二分查找定位引入 bug 的变更
#branch列出、创建或删除分支
#checkout检出一个分支或路径到工作区
#clone克隆一个版本库到一个新目录
#commit记录变更到版本库
#diff显示提交之间、提交和工作区之间等的差异
fetch从另外一个版本库下载对象和引用
grep输出和模式匹配的行
#init创建一个空的
#log显示提交日志
#merge合并两个或更多开发历史
#mv移动或重命名一个文件、目录或符号链接
#pull获取并合并另外的版本库或一个本地分支
#push更新远程引用和相关的对象
rebase本地提交转移至更新后的上游分支中
#reset重置当前HEAD到指定状态
#rm从工作区和索引中删除文件
show显示各种类型的对象
#status显示工作区状态
#tag创建、列出、删除或校验一个GPG签名的 tag 对象

常用操作示意图

1190037-20171130170959948-2117269594.png

文件的状态变化周期

1190037-20171130171009651-1964332055.png

1.6.1 创建文件

 [root@gitlab git_data]# touch README[root@gitlab git_data]# git status# 位于分支 master## 初始提交## 未跟踪的文件:#   (使用 "git add <file>..." 以包含要提交的内容)##    README提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)---# On branch master## Initial commit## Untracked files:#   (use "git add <file>..." to include in what will be committed)##       READMEnothing added to commit but untracked files present (use "git add" to track)

添加文件跟踪

 [root@gitlab git_data]# git add ./*[root@gitlab git_data]# git status# 位于分支 master## 初始提交## 要提交的变更:#   (使用 "git rm --cached <file>..." 撤出暂存区)##    新文件:    README#---# On branch master## Initial commit## Changes to be committed:#   (use "git rm --cached <file>..." to unstage)##       new file:   README#​

文件会添加到.git的隐藏目录

 [root@gitlab git_data]# tree  .git/.git/├── branches├── config├── description├── HEAD├── hooks│   ├── applypatch-msg.sample│   ├── commit-msg.sample│   ├── post-update.sample│   ├── pre-applypatch.sample│   ├── pre-commit.sample│   ├── prepare-commit-msg.sample│   ├── pre-push.sample│   ├── pre-rebase.sample│   └── update.sample├── index├── info│   └── exclude├── objects│   ├── e6│   │   └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391│   ├── info│   └── pack└── refs├── heads└── tags

由工作区提交到本地仓库

 [root@gitlab git_data]# git commit  -m 'first commit'  [master(根提交) bb963eb] first commit1 file changed, 0 insertions(+), 0 deletions(-)create mode 100644 README

查看git的状态

 [root@gitlab git_data]# git status# 位于分支 master无文件要提交,干净的工作区​# On branch masternothing to commit, working directory clean

提交后的git目录状态

 [root@gitlab git_data]# tree  .git/.git/├── branches├── COMMIT_EDITMSG├── config├── description├── HEAD├── hooks│   ├── applypatch-msg.sample│   ├── commit-msg.sample│   ├── post-update.sample│   ├── pre-applypatch.sample│   ├── pre-commit.sample│   ├── prepare-commit-msg.sample│   ├── pre-push.sample│   ├── pre-rebase.sample│   └── update.sample├── index├── info│   └── exclude├── logs│   ├── HEAD│   └── refs│       └── heads│           └── master├── objects│   ├── 54│   │   └── 3b9bebdc6bd5c4b22136034a95dd097a57d3dd│   ├── bb│   │   └── 963eb32ad93a72d9ce93e4bb55105087f1227d│   ├── e6│   │   └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391│   ├── info│   └── pack└── refs├── heads│   └── master└── tags

1.6.2 添加新文件

 git add  * 添加到暂存区域git commit  提交git仓库 -m 后面接上注释信息,内容关于本次提交的说明,方便自己或他人查看

修改或删除原有文件

常规方法

 git add  *git commit

简便方法

 git commit -a  -m "注释信息"

-a 表示直接提交

 Tell the command to automatically stage files that have been modified and deleted, but new files you have not told Git about arenot affected.

1.6.3 删除git内的文件

命令说明:

• 没有添加到暂存区的数据直接rm删除即可。

• 已经添加到暂存区数据:

git rm --cached database

#→将文件从git暂存区域的追踪列表移除(并不会删除当前工作目录内的数据文件)

git rm -f database

#→将文件数据从git暂存区和工作目录一起删除

命令实践:

 # 创建新文件
 [root@gitlab git_data]# touch 123[root@gitlab git_data]# git status# 位于分支 master# 未跟踪的文件:#   (使用 "git add <file>..." 以包含要提交的内容)##    123提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)---# On branch master# Untracked files:#   (use "git add <file>..." to include in what will be committed)##       123nothing added to commit but untracked files present (use "git add" to track)

# 将文件添加到暂存区域

 [root@gitlab git_data]# git add 123[root@gitlab git_data]# git status# 位于分支 master# 要提交的变更:#   (使用 "git reset HEAD <file>..." 撤出暂存区)##    新文件:    123---# On branch master# Changes to be committed:#   (use "git reset HEAD <file>..." to unstage)##       new file:   123

# 删除文件

 [root@gitlab git_data]# rm 123 -f[root@gitlab git_data]# lsREADME[root@gitlab git_data]# git status# 位于分支 master# 要提交的变更:#   (使用 "git reset HEAD <file>..." 撤出暂存区)##    新文件:    123## 尚未暂存以备提交的变更:#   (使用 "git add/rm <file>..." 更新要提交的内容)#   (使用 "git checkout -- <file>..." 丢弃工作区的改动)##    删除:      123# ---# On branch master# Changes to be committed:#   (use "git reset HEAD <file>..." to unstage)##       new file:   123## Changes not staged for commit:#   (use "git add/rm <file>..." to update what will be committed)#   (use "git checkout -- <file>..." to discard changes in working directory)##       deleted:    123[root@gitlab git_data]# git reset HEAD  ./* [root@gitlab git_data]# git status# 位于分支 master无文件要提交,干净的工作区---# On branch masternothing to commit, working directory clean

1.6.4 重命名暂存区数据

• 没有添加到暂存区的数据直接mv/rename改名即可。

• 已经添加到暂存区数据:

 git mv README NOTICE
 [root@gitlab git_data]# git mv README notice[root@gitlab git_data]# git status# On branch master# Changes to be committed:#   (use "git reset HEAD <file>..." to unstage)##       renamed:    README -> notice#

1.6.5 查看历史记录

• git log #→查看提交历史记录

• git log -2 #→查看最近几条记录

• git log -p -1 #→-p显示每次提交的内容差异,例如仅查看最近一次差异

• git log --stat -2 #→--stat简要显示数据增改行数,这样能够看到提交中修改过的内容,对文件添加或移动的行数,并在最后列出所有增减行的概要信息

• git log --pretty=oneline #→--pretty根据不同的格式展示提交的历史信息

• git log --pretty=fuller -2 #→以更详细的模式输出提交的历史记录

• git log --pretty=fomat:"%h %cn" #→查看当前所有提交记录的简短SHA-1哈希字串与提交着的姓名。

使用format参数来指定具体的输出格式

格式说明
%s提交说明。
%cd提交日期。
%an作者的名字。
%cn提交者的姓名。
%ce提交者的电子邮件。
%H提交对象的完整SHA-1哈希字串。
%h提交对象的简短SHA-1哈希字串。
%T树对象的完整SHA-1哈希字串。
%t树对象的简短SHA-1哈希字串。
%P父对象的完整SHA-1哈希字串。
%p父对象的简短SHA-1哈希字串。
%ad作者的修订时间。

命令实践

 [root@gitlab git_data]# git logcommit f5b79552635a7dc60afc35c99c1170366d8c5f6bAuthor: newrain <newrain@aliyun.com>Date:   Sat May 11 21:29:21 2019 -0700​456​commit e9ed8b38a0052cdcd85ecee833ea8198b077f881Author: newrain <root@vmdesk.localdomain>Date:   Sat May 11 21:21:12 2019 -0700​commit 123​commit 9d394114177b8da9e452d001ec610e9c45ceede3Author: newrain <root@vmdesk.localdomain>Date:   Sat May 11 20:19:23 2019 -0700​first commit

1.6.6 还原历史数据

Git服务程序中有一个叫做HEAD的版本指针,当用户申请还原数据时,其实就是将HEAD指针指向到某个特定的提交版本,但是因为Git是分布式版本控制系统,为了避免历史记录冲突,故使用了SHA-1计算出十六进制的哈希字串来区分每个提交版本,另外默认的HEAD版本指针会指向到最近的一次提交版本记录,而上一个提交版本会叫HEAD^,上上一个版本则会叫做HEAD^^,当然一般会用HEAD~5来表示往上数第五个提交版本。

git reset --hard hash

git reset --hard HEAD^ #→还原历史提交版本上一次

git reset --hard 3de15d4 #→找到历史还原点的SHA-1值后,就可以还原(值不写全,系统

会自动匹配)

测试命令

 [root@gitlab git_data]# git logcommit f5b79552635a7dc60afc35c99c1170366d8c5f6bAuthor: newrain <newrain@aliyun.com>Date:   Sat May 11 21:29:21 2019 -0700​456​commit e9ed8b38a0052cdcd85ecee833ea8198b077f881Author: newrain <root@vmdesk.localdomain>Date:   Sat May 11 21:21:12 2019 -0700​commit 123​commit 9d394114177b8da9e452d001ec610e9c45ceede3Author: newrain <root@vmdesk.localdomain>Date:   Sat May 11 20:19:23 2019 -0700​first commit
 ​

还原数据

 [root@gitlab git_data]# git reset --hard e9ed8b38aHEAD is now at e9ed8b3 commit 123HEAD 现在位于 e9ed8b3 commit 123# 查看数据[root@gitlab git_data]# ls123 README

1.6.7 还原未来数据

什么是未来数据?就是你还原到历史数据了,但是你后悔了,想撤销更改,但是git log已经找不到这个版本了。

git reflog #→查看未来历史更新点

测试命令

 [root@gitlab git_data]#  git refloge9ed8b3 HEAD@{0}: reset: moving to e9ed8b38af5b7955 HEAD@{1}: commit: 456e9ed8b3 HEAD@{2}: commit: commit 1239d39411 HEAD@{3}: commit (initial): first commit[root@gitlab git_data]#  

1.6.8 标签使用

前面回滚使用的是一串字符串,又长又难记。

git tag v1.0 #→当前提交内容打一个标签(方便快速回滚),每次提交都可以打个tag。

git tag #→查看当前所有的标签

git show v1.0 #→查看当前1.0版本的详细信息

git tag v1.2 -m "version 1.2 release is test" #→创建带有说明的标签,-a指定标签名字,-m指定说明文字

git tag -d v1.0 #→我们为同一个提交版本设置了两次标签,删除之前的v1.0

测试命令

 [root@gitlab git_data]# git reset --hard e9ed8b38aHEAD is now at e9ed8b3 commit 123[root@gitlab git_data]# git reset --hard V1.0HEAD is now at e9ed8b3 add test dir​[root@gitlab git_data]# git tag  v20171129[root@gitlab git_data]# git tag v20171129

1.6.9 对比数据

git diff可以对比当前文件与仓库已保存文件的区别,知道了对README作了什么修改

后,再把它提交到仓库就放⼼多了。

 git diff READMEgit diff --name-only HEAD HEAD^git diff --name-only head_id head_id2

1.7 分支结构

在实际的项目开发中,尽量保证master分支稳定,仅用于发布新版本,平时不要随便直接修改里面的数据文件。

那在哪干活呢?干活都在dev分支上。每个人从dev分支创建自己个人分支,开发完合并到dev分支,最后dev分支合并到master分支。所以团队的合作分支看起来会像下图那样。

1190037-20171130171522167-746209354.png

1.7.1 分支切换

 [root@gitlab git_data]# git branch newrain[root@gitlab git_data]# git branch * masternewrain[root@gitlab git_data]# git checkout newrain 切换到分支 'newrain'Switched to branch 'newrain'[root@gitlab git_data]# git branch master* newrain

在newrain 分支进行修改

 [root@gitlab git_data]# cat README This is git_data readme[root@gitlab git_data]#  echo '1901' >> README [root@gitlab git_data]# git add .[root@gitlab git_data]# git commit -m '1901'[newrain 4310e7e] 19011 file changed, 1 insertion(+)[root@gitlab git_data]# git status# On branch newrainnothing to commit, working directory clean---# 位于分支 newrain无文件要提交,干净的工作区

回到master分支

 [root@gitlab git_data]# git checkout masterSwitched to branch 'master'切换到分支 'master'[root@gitlab git_data]# cat README This is git_data readme[root@gitlab git_data]# git log  -1commit f5b79552635a7dc60afc35c99c1170366d8c5f6bAuthor: newrain <newrain@aliyun.com>Date:   Sat May 11 21:29:21 2019 -0700​456
 

合并代码

 [root@gitlab git_data]#  git merge newrainUpdating f5b7955..4310e7eFast-forwardREADME | 1 +1 file changed, 1 insertion(+)[root@gitlab git_data]# git status# On branch masternothing to commit, working directory clean# 位于分支 master无文件要提交,干净的工作区[root@gitlab git_data]# cat README This is git_data readme1901

1.7.2 合并失败解决

模拟冲突,在文件的同一行做不同修改

在master 分支进行修改

 [root@gitlab git_data]# cat README This is git_data readme1901[root@gitlab git_data]#  echo '1901-git' > README [root@gitlab git_data]#  git commit -m 'newrain 1901-git'[master 4e6c548] newrain 1901-git1 file changed, 1 insertion(+), 2 deletions(-)

切换到newrain分支

 [root@gitlab git_data]# git checkout newrainSwitched to branch 'newrain'[root@gitlab git_data]# cat README This is git_data readme1901[root@gitlab git_data]# echo 'newrain' >> README [root@gitlab git_data]# git commit -m '1901-git-check'# On branch newrain# Changes not staged for commit:#   (use "git add <file>..." to update what will be committed)#   (use "git checkout -- <file>..." to discard changes in working directory)##       modified:   README#no changes added to commit (use "git add" and/or "git commit -a")
 ​

回到master分区,进行合并,出现冲突

 [root@gitlab git_data]# git checkout master 切换到分支 'master'[root@gitlab git_data]# git merge linux自动合并 README冲突(内容):合并冲突于 README自动合并失败,修正冲突然后提交修正的结果。

解决冲突

 [root@gitlab git_data]# vim README This is git_data readme1901newrainmeger test timeger test master

# 手工解决冲突

 [root@gitlab git_data]# git commit -a -m "merge-ti-test"[master 2594b2380] merge-ti-test

1.7.3 删除分支

因为之前已经合并了newrain分支,所以现在看到它在列表中。 在这个列表中分支名字前没有 * 号的分支通常可以使用 git branch -d 删除掉;你已经将它们的工作整合到了另一个分支,所以并不会失去任何东西。

查看所有包含未合并工作的分支,可以运行 git branch --no-merged**:

 git branch --no-mergedtesting

这里显示了其他分支。 因为它包含了还未合并的工作,尝试使用 git branch -d 命令删除它时会失败:

 git branch -d testingerror: The branch 'testing' is not fully merged.If you are sure you want to delete it, run 'git branch -D testing'. 

如果真的想要删除分支并丢掉那些工作,如同帮助信息里所指出的,可以使用 -D 选项强制删除它。

1.9 gitlab的使用

前面我们已经知道Git人人都是中心,那他们怎么交互数据呢?

• 使用GitHub或者码云等公共代码仓库

• 使用GitLab私有仓库

1.9.1 安装配置gitlab

安装

 # 安装依赖,并启动ssh、防火墙开启相应端口、postfix
 [root@gitlab ~]# yum install -y curl policycoreutils-python openssh-server perl
 # 安装完成后会直接启动
 [root@gitlab ~]# yum install gitlab-jh-16.0.3-jh.0.el7.x86_64.rpm

初始化

 # 以下两种方法都可以配置访问地址,第一种需要在yum安装前配置
[root@gitlab ~]# export EXTERNAL_URL='http://192.168.249.156'或[root@gitlab ~]# vim /etc/gitlab/gitlab.rbexternal_url 'http://192.168.249.156'[root@gitlab ~]# gitlab-ctl reconfigure

状态

 [root@gitlab ~]#  gitlab-ctl statusrun: gitaly: (pid 4491) 48s; run: log: (pid 4087) 279srun: gitlab-monitor: (pid 4539) 44s; run: log: (pid 4251) 207srun: gitlab-workhorse: (pid 4501) 47s; run: log: (pid 4099) 273srun: logrotate: (pid 4125) 265s; run: log: (pid 4124) 265srun: nginx: (pid 4112) 271s; run: log: (pid 4111) 271srun: node-exporter: (pid 4175) 243s; run: log: (pid 4174) 243srun: postgres-exporter: (pid 4528) 45s; run: log: (pid 4223) 219srun: postgresql: (pid 3933) 343s; run: log: (pid 3932) 343srun: prometheus: (pid 4514) 46s; run: log: (pid 4156) 259srun: redis: (pid 3876) 355s; run: log: (pid 3875) 355srun: redis-exporter: (pid 4186) 237s; run: log: (pid 4185) 237srun: sidekiq: (pid 4078) 281s; run: log: (pid 4077) 281srun: unicorn: (pid 4047) 287s; run: log: (pid 4046) 287s

检查端口

 [root@gitlab ~]# netstat -lntup|grep 80tcp        0      0 127.0.0.1:8080      0.0.0.0:*    LISTEN     4073/unicorn master tcp        0      0 0.0.0.0:80      0.0.0.0:*         LISTEN      4112/nginx: master  tcp        0      0 0.0.0.0:8060       0.0.0.0:*      LISTEN      4112/nginx: master
  

1.9.2 使用浏览器访问,进行web界面操作

登陆 Gitlab

1

如果需要手工修改nginx的port ,可以在gitlab.rb中设置 nginx['listen_port'] = 8000 ,然后再次 gitlab-ctl reconfigure即可

登录 gitlab 如下所示(首次登陆设置 root 密码):

密码存放在 /etc/gitlab/initial_root_password 文件中,该文件会在24小时后删除

1

创建项目组 group ,组名为plat-sp ,如下所示:

1

1

去掉用户的自动注册功能(安全): admin are -> settings -> Sign-up Restrictions 去掉钩钩,然后拉到最下面保存,重新登录

1

在服务器上创建ssh密钥 使用ssh-ketgen 命令

[root@gitlab ~]# ssh-keygen Generating public/private rsa key pair.Enter file in which to save the key (/root/.ssh/id_rsa): Created directory '/root/.ssh'.Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa.Your public key has been saved in /root/.ssh/id_rsa.pub.The key fingerprint is:SHA256:n/V2kCiwwm2UfBsnQLm17eXUCBiBByyPbefmz5oQvfU root@gitlabThe key's randomart image is:+---[RSA 2048]----+|       o++o+     ||      ..+o+ .    ||       ==++o.. o ||     ..o==o=..+..||      o.So+.++o  ||       o oo*.o.. ||        .o+   E .||         ..o . . ||          ooo    |+----[SHA256]-----+[root@gitlab .ssh]# cat id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDSVdBypha/ALMmvIiZGXxYGz7FJ5TC+hYWo7QGBJ+J6JVinp9yH851fwxln5TWGBrtEousoVHXTTJfFRy8LV+Ho7OfaksYt+5TPxEjf5XX53Z3ZX70PYH3DQFmgzl0QpWw1PYIjrD7kBeLhUg+R/ZePS+HzPvbRCb6gOlkdx46vX4Olr7YbAO5lzAarhaZcE2Q702kPXGeuZbR7KcwVhtoiueyHwyj94bccMfKq7qSskXGbpWuCwcaKQ6uqGap1rP5Viqqv0xeO7Vq0dIZ/YnPL2vPDUvNa36nHosiZGkn4thpPh63KjXaFIfKOuPemLzvDZY0A+88P8gwmAYiPoxp root@gitlab

将密钥添加到web界面的用户中

image-20210615215843063

image-20210615220004937

1.9.3 gitlab 命令行修改密码

 gitlab-rails console -e productionirb(main):001:0> user = User.where(id: 1).first     # id为1的是超级管理员irb(main):002:0> user.password = 'yourpassword'      # 密码必须至少8个字符irb(main):003:0> user.save!                          # 如没有问题 返回trueexit                                                # 退出

1.9.4 gitlab服务管理

 gitlab-ctl start                        # 启动所有 gitlab 组件;gitlab-ctl stop                         # 停止所有 gitlab 组件;gitlab-ctl restart                      # 重启所有 gitlab 组件;gitlab-ctl status                       # 查看服务状态;gitlab-ctl reconfigure                  # 启动服务;vim /etc/gitlab/gitlab.rb               # 修改默认的配置文件;gitlab-ctl tail                         # 查看日志;

1.9.5 公司的开发代码提交处理流程

PM(项目主管/项目经理)在gitlab创建任务,分配给开发人员 开发人员领取任务后,在本地使用git clone拉取代码库 开发人员创建开发分支(git checkout -b dev),并进行开发 开发人员完成之后,提交到本地仓库(git commit ) 开发人员在gitlab界面上申请分支合并请求(Merge request) PM在gitlab上查看提交和代码修改情况,确认无误后,确认将开发人员的分支合并到主分支(master) 开发人员在gitlab上Mark done确认开发完成,并关闭issue。这一步在提交合并请求时可以通过描述中填写"close #1"等字样,可以直接关闭issue

创建项目管理用户Tompson如下所示:

1

同样的方法,再创建Eric 、Hellen 用户。用户添加完毕后,gitlab会给用户发一封修改密码的邮件,各用户需要登录自己的邮箱,并点击相关的链接,设置新密码。

将用户添加到组中,指定Tompson为本组的owner:

1

同样的方法将用户Eric、Hellen也添加到组中,并指定他们为Developer:

1

使用 Tompson 用户的身份与密码登录到 gitlab 界面中,并创建项目 Project ,如下所示:

1

指定项目的存储路径和项目名称,如下所示

1

1

为项目创建Dev分支,如下所示:

1

1

在 client 上添加Tompson的用户:

 
[root@vm2 ~]# useradd Tompson[root@vm2 ~]# useradd Eric[root@vm2 ~]# useradd Hellen[root@vm2 ~]# su - Tompson[Tompson@vm2 ~]$ ssh-keygen -C Tompson@domain.cnGenerating public/private rsa key pair.Enter file in which to save the key (/home/Tompson/.ssh/id_rsa): Created directory '/home/Tompson/.ssh'.Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/Tompson/.ssh/id_rsa.Your public key has been saved in /home/Tompson/.ssh/id_rsa.pub.The key fingerprint is:SHA256:SAoAH2zSxqEJqVgKKrxM5XMi6tKe61JMRdwMhwBNIrE Tompson@domain.cnThe key's randomart image is:+---[RSA 2048]----+|XX==o=.          ||*BOo+.o          ||E*=.  .          ||*+.= + .         ||=oo = . S        ||.oo              ||.o               ||o...             ||.+=.             |+----[SHA256]-----+[Tompson@vm2 ~]$ cat .ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDZ8cRGHej+sZzlmK36W5MUXMLOGdTwFI9Jj44mGuabZCrlYW4GDpL6ppezN+Sur0wHtnKonYJzm8ntqS0S0UHyaPPQPl9Mrs/6Z4VrXZ/4RlqHdWeSrmOwCBQld0l8HvrmP4TyGHrOreO8uZqimd/Z+OiMqnYRZzENX11Pti/Px5g1MtJcoCi9uLtF42QYrt1X/fzAyPU9C5/5ZUq4Jln3EF20bzcA52oAzZIl0jrhI0TeTeW6zYq+KxdHGshL+qG7+Ne+akPOe4Ma5BQjcMZ2dQ2kbGuozXmLT8RDcj9YRKceQsUdTI71lJpwrWKGn8Vhra0EaK3hgoTuvMYaGfOF Tompson@domain.cn

将Tompson的公钥复制到gitlab中: 使用Tompson用户的身份与密码登录到gitlab界面中,然后在ssh-key中添加 相关的key ,如下所示:

1

1

为Tompson用户配置git ,如下所示:

 [Tompson@vm2 ~]$ git config --global user.email "Tompson@domain.cn"[Tompson@vm2 ~]$ git config --global user.name "Tompson"​[Tompson@vm2 ~]$ git clone git@192.168.60.119:plat-sp/chathall.gitCloning into 'chathall'...The authenticity of host '192.168.60.119 (192.168.60.119)' can't be established.ECDSA key fingerprint is SHA256:CDxAQmj6gUkIxB6XUofbZ853GuPM5LS2QO4a5dD7jRo.ECDSA key fingerprint is MD5:4e:20:72:a7:46:c6:d7:5d:bb:9d:ce:c3:f3:da:43:f9.Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added '192.168.60.119' (ECDSA) to the list of known hosts.remote: Counting objects: 3, done.remote: Total 3 (delta 0), reused 0 (delta 0)Receiving objects: 100% (3/3), done.[Tompson@vm2 ~]$ [Tompson@vm2 ~]$ cd chathall/[Tompson@vm2 chathall]$ lsReadme.txt[Tompson@vm2 chathall]$

创建一下新文件,添加内容,并提交到master分支:

 [Tompson@vm2 chathall]$ vim test.sh[Tompson@vm2 chathall]$ cat test.sh #!/bin/bashecho "gitlab test"[Tompson@vm2 chathall]$ git add . [Tompson@vm2 chathall]$ git commit -m '201805101649'[master 80edf6b] 2018051016491 file changed, 2 insertions(+)create mode 100644 test.sh[Tompson@vm2 chathall]$ [Tompson@vm2 chathall]$ git push -u origin master Counting objects: 4, done.Compressing objects: 100% (2/2), done.Writing objects: 100% (3/3), 305 bytes | 0 bytes/s, done.Total 3 (delta 0), reused 0 (delta 0)To git@192.168.60.119:plat-sp/chathall.git4611654..80edf6b  master -> masterBranch master set up to track remote branch master from origin.[Tompson@vm2 chathall]$

使用Eric用户登录,并clone 项目,如下所示:

 [root@vm2 ~]# su - Eric[Eric@vm2 ~]$ ssh-keygen -C Eric@domain.cnGenerating public/private rsa key pair.Enter file in which to save the key (/home/Eric/.ssh/id_rsa): Created directory '/home/Eric/.ssh'.Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/Eric/.ssh/id_rsa.Your public key has been saved in /home/Eric/.ssh/id_rsa.pub.The key fingerprint is:SHA256:VZaJvjA5SJZEB+yuRpDBNHCECCZ5R8X0DYcNE0f1B6E Eric@domain.cnThe key's randomart image is:+---[RSA 2048]----+|*O=..B*o**+o+oo. ||*.+.. *o.*oooo . || . + + ..oo E . .||  o   o =..    . ||   . .  S+ .     ||    . .   .      ||   . .           ||    o            ||   .             |+----[SHA256]-----+​[Eric@vm2 ~]$ cat .ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDxQcn4UjRW/5PT5witeV9+S2w8WK5ouawHxEF7s9wuWsT4pqhcu5BN74NG3CPaq1jJZnkV+aQsTw+60BAd1gOK0FBbKWxmohmE61n9vfpUT5igJ72t2jpXjfKwLIHw+Iq5yM4yUhkwSsoBuZkxYSEltnj8OvXaOlCDYnXuGBa9+xO8f5yVIcOtiwRvv+Y1PRRzSIcazPVZax9FLK26t1R4NPiY4xWkIJyK2OrKMeiaBBzyMfWzHdmsCWa51oSrYSmz3PDBXpzIBs3OdKxcaJs9Lc5u87YCV5RMUjLrPcA7nPK6crOabLXhz3d5GSYggMTOByQkyKOo7WlYpARCHOt/ Eric@domain.cn[Eric@vm2 ~]$ 

同样需要使用Eric用户登录gitlab web 界面,并添加相应的ssh-key。然后设置git ,并clone项目:

 [Eric@vm2 ~]$ git config --global user.email "Eric@domain.cn"[Eric@vm2 ~]$ git config --global user.name "Eric"[Eric@vm2 ~]$ git clone git@192.168.60.119:plat-sp/chathall.gitCloning into 'chathall'...The authenticity of host '192.168.60.119 (192.168.60.119)' can't be established.ECDSA key fingerprint is SHA256:CDxAQmj6gUkIxB6XUofbZ853GuPM5LS2QO4a5dD7jRo.ECDSA key fingerprint is MD5:4e:20:72:a7:46:c6:d7:5d:bb:9d:ce:c3:f3:da:43:f9.Are you sure you want to continue connecting (yes/no)? yesremote: Counting objects: 6, done.remote: Compressing objects: 100% (3/3), done.remote: Total 6 (delta 0), reused 0 (delta 0)Receiving objects: 100% (6/6), done.[Eric@vm2 ~]$ 

切换到dev分支,修改文件内容,并将新code提交到dev分支(Developer角色默认并没有提交master的权限):

 [Eric@vm2 chathall]$ git checkout dev Branch dev set up to track remote branch dev from origin.Switched to a new branch 'dev'[Eric@vm2 chathall]$ lsReadme.txt  test.sh[Eric@vm2 chathall]$ vim test.sh [Eric@vm2 chathall]$ cat test.sh #!/bin/bashecho "gitlab test"echo "brahch test"[Eric@vm2 chathall]$ git add . [Eric@vm2 chathall]$ git commit -m '201805101658'[dev 6687039] 2018051016581 file changed, 1 insertion(+)[Eric@vm2 chathall]$ git push -u origin dev Counting objects: 5, done.Compressing objects: 100% (3/3), done.Writing objects: 100% (3/3), 306 bytes | 0 bytes/s, done.Total 3 (delta 0), reused 0 (delta 0)remote: remote: To create a merge request for dev, visit:remote:   http://192.168.60.119/plat-sp/chathall/merge_requests/new?merge_request%5Bsource_branch%5D=devremote: To git@192.168.60.119:plat-sp/chathall.git80edf6b..6687039  dev -> devBranch dev set up to track remote branch dev from origin.[Eric@vm2 chathall]$[Eric@vm2 chathall]$ git checkout master Switched to branch 'master'[Eric@vm2 chathall]$ git branch dev* master[Eric@vm2 chathall]$

使用Eric 用户登录gitlab web,在界面中 创建一个合并请求:

1

提交合并请求:

1

然后使用Tompson用户登录 gitlab web ,找到“合并请求” ,然后将dev分支合并到master分支,如下所示:

1

1

1.9.6 Gitlab 备份与恢复

1、查看系统版本和软件版本
 [root@gitlab gitlab]# cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) ​[root@gitlab gitlab]# cat /opt/gitlab/embedded/service/gitlab-rails/VERSION8.15.4
2、数据备份

打开/etc/gitlab/gitlab.rb配置文件,查看一个和备份相关的配置项:

 gitlab_rails['backup_path'] = "/data/gitlab/backups"

该项定义了默认备份出文件的路径,可以通过修改该配置,并执行 gitlab-ctl reconfigure 或者 gitlab-ctl restart 重启服务生效。

执行备份命令进行备份

 /opt/gitlab/bin/gitlab-rake gitlab:backup:create 

也可以添加到 crontab 中定时执行:

 0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create

可以到/data/gitlab/backups找到备份包,解压查看,会发现备份的还是比较全面的,数据库、repositories、build、upload等分类还是比较清晰的。

设置备份保留时常,防止每天执行备份,肯定有目录被爆满的风险,打开/etc/gitlab/gitlab.rb配置文件,找到如下配置:

 gitlab_rails['backup_keep_time'] = 604800

设置备份保留7天(7360024=604800),秒为单位,如果想增大或减小,可以直接在该处配置,并通过gitlab-ctl restart 重启服务生效。

备份完成,会在备份目录中生成一个当天日期的tar包。

3、测试数据恢复
(1) 安装部署 gitlab server

具体步骤参见上面:gitlab server 搭建过程

(2) 恢复 gitlab

打开/etc/gitlab/gitlab.rb配置文件,查看一个和备份相关的配置项:

 gitlab_rails['backup_path'] = "/data/gitlab/backups"

修改该配置,定义了默认备份出文件的路径,并执行 gitlab-ctl reconfigure 或者 gitlab-ctl restart 重启服务生效。

恢复前需要先停掉数据连接服务:

 [root@gitlab ]# gitlab-ctl stop unicorn[root@gitlab ]# gitlab-ctl stop sidekiq

如果是台新搭建的主机,不需要操作,理论上不停这两个服务也可以。停这两个服务是为了保证数据一致性。将老服务器/data/gitlab/backups目录下的备份文件拷贝到新服务器上的/data/gitlab/backups

 [root@gitlab gitlab]# rsync -avz 1530773117_2019_03_05_gitlab_backup.tar 192.168.95.135:/data/gitlab/backups/ 

注意权限:600权限是无权恢复的。 实验环境可改成了777,生产环境建议修改属主属组

 [root@gitlab backups]# pwd/data/gitlab/backups[root@gitlab backups]# chmod 777 1530773117_2019_03_05_gitlab_backup.tar [root@gitlab backups]# lltotal 17328900-rwxrwxrwx 1 git git 17744793600 Jul  5 14:47 1530773117_2018_07_05_gitlab_backup.tar

执行下面的命令进行恢复:后面再输入两次yes就完成恢复了。

 [root@gitlab backups]# gitlab-rake gitlab:backup:restore BACKUP=1530773117_2018_07_05_gitlab_backup.tar

恢复完成后,启动刚刚的两个服务,或者重启所有服务,再打开浏览器进行访问,发现数据和之前的一致:

 [root@gitlab backups]# gitlab-ctl start unicorn[root@gitlab backups]# gitlab-ctl start sidekiq或[root@gitlab backups]# gitlab-ctl restart

注意:通过备份文件恢复gitlab必须保证两台主机的gitlab版本一致,否则会提示版本不匹配

1.9.7 邮箱配置

 [root@gitlab ]# vim /etc/gitlab/gitlab.rbgitlab_rails['smtp_enable'] = truegitlab_rails['smtp_address'] = "smtp.163.com"gitlab_rails['smtp_port'] = 465gitlab_rails['smtp_user_name'] = "newrain_wang@163.com"gitlab_rails['smtp_password'] = "UWYNCPQOBQFCDLIW"gitlab_rails['smtp_domain'] = "smtp.163.com"gitlab_rails['smtp_authentication'] = "login"gitlab_rails['smtp_enable_starttls_auto'] = falsegitlab_rails['smtp_tls'] = truegitlab_rails['smtp_pool'] = falsegitlab_rails['gitlab_email_from'] = 'newrain_wang@163.com'​[root@gitlab ]# gitlab-ctl reconfigure

相关文章:

Git详解及 github与gitlab使用

目录 1.1 关于版本控制 1.1.1 本地版本控制 1.1.2 集中化的版本控制系统 1.1.3 分布式版本控制系统 1.2 Git简介 1.2.1 Git历史 1.3 安装git 1.3.1 环境说明 1.3.2 Yum安装Git 1.3.3 编译安装 1.4 初次运行 Git 前的配置 1.4.1 配置git 1.4.2 获取帮助 1.5 获取 G…...

政安晨:【完全零基础】认知人工智能(二)【超级简单】的【机器学习神经网络】—— 底层算法

如果小伙伴第一次看到这篇文章&#xff0c;可以先浏览一下我这个系列的上一篇文章&#xff1a; 政安晨&#xff1a;【完全零基础】认知人工智能&#xff08;一&#xff09;【超级简单】的【机器学习神经网络】 —— 预测机https://blog.csdn.net/snowdenkeke/article/details/…...

基于springboot+vue的美发门店管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…...

C语言第二十八弹---整数在内存中的存储

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 目录 1、整数在内存中的存储 2、大小端字节序和字节序 2.1、什么是大小端&#xff1f; 2.2、为什么有大小端? 2.3、练习 2.3.1、练习1 2.3.2、练习2 2.…...

java开源xml工具类介绍

在Java中处理XML的常用开源工具有很多&#xff0c;以下是一些流行的库以及简单的示例代码&#xff1a; DOM4J DOM4J 是一个非常流行的Java库&#xff0c;用于处理XML&#xff0c;DOM4J 易于使用&#xff0c;并且提供了很好的性能。 Maven 依赖 …...

Go 语言一些常用语法编写和优化指南

Go 语言以其简洁的语法和强大的并发性能而受到开发者的喜爱。然而&#xff0c;为了充分利用 Go 的潜力&#xff0c;我们需要了解如何优化 Go 程序。本文将介绍一些常见的 Go 语言优化技巧&#xff0c;并通过实际例子进行说明。 推荐系列 来来来,老铁们,男人女人都需要的技术活…...

Golang 语法系列:结构体

结构体&#xff1a;相当于"类" 1.结构体声明 type [name] struct {[field_name] [field_type][field_name] [field_type]... }//例子&#xff1a;type Person struct {name stringage int }其中field_name可以省略 2.结构体的使用 1) 格式1 var person Person p…...

关于iPad中的密码和触控ID的使用,看这篇文章就差不多了

序言 许多苹果iPad型号都有熟悉的密码系统和触控ID,这需要指纹扫描才能解锁设备。本指南向你展示如何使用iPad Air 2或更高版本、iPad Mini 3或更新版本以及iPad Pro设置或更改密码和触控ID指纹。 一些iPad Pro型号支持面部识别,并配备了面容ID而不是触控ID作为安全功能。面…...

Vue3之ref与reactive的基本使用

ref可以创建基本类型、对象类型的响应式数据 reactive只可以创建对象类型的响应式数据 接下来让我为大家介绍一下吧&#xff01; 在Vue3中&#xff0c;我们想让数据变成响应式数据&#xff0c;我们需要借助到ref与reactive 先为大家介绍一下ref如何使用还有什么注意点 我们需…...

wsl内置Ubuntu使用 Dinky 与 Flink 集成

Dinky 与 Flink 集成 说明 本文档介绍 Dinky 与 Flink 集成的使用方法, 如果您是 Dinky 的新用户, 请先阅读 本文档, 以便更好的搭建 Dinky 环境 如果您已经熟悉 Dinky 并已经部署了 Dinky, 请跳过本文档的前置要求部分, 直接阅读 Dinky 与 Flink 集成部分 注意: 本文档基…...

”戏说“ 交换机 与 路由器

一般意义上说 老哥 这文章发表 的 东一榔头 西一锤 呵呵&#xff0c; 想到哪里就啰嗦到哪里 。 交换机&#xff1a; 其实就是在通道交换 路由器&#xff1a; 不光是在通道交换还要在协议上交换 下图你看懂了吗&#xff1f; &#xff08;仅仅数据交换-交换机 协议…...

Linux pageset

1. 引言 在用户进程发生缺页异常时&#xff0c;Linux内核需要分配所需物理页面以及建立也表映射&#xff0c;来维持进程的正常内存使用需求。而对于分配物理页面仅依赖于buddy系统&#xff0c;对于小order页面的分配效率较低。因此Linux通过在每个cpu维护一个page链表&#xff…...

【C++之语法篇003】

C学习笔记---003 C知识开篇1、内联函数1.1、什么是内联函数?1.2、解决外部头文件&#xff0c;重复定义问题1.3、内联函数的总结 2、auto关键字2.1、auto的作用2.2、auto的总结 3、范围for3.1、什么是范围for&#xff1f;3.2、范围for的循环应用 4、指针空值关键字nullptr4.1、…...

Github代码仓库SSH配置流程

作者&#xff1a; Herman Ye Auromix 测试环境&#xff1a; Ubuntu20.04 更新日期&#xff1a; 2024/02/21 注1&#xff1a; Auromix 是一个机器人爱好者开源组织。 注2&#xff1a; 由于笔者水平有限&#xff0c;以下内容可能存在事实性错误。 相关背景 在为Github代码仓库配…...

Arrays工具类的常见方法总结

一、Arrays.asList( ) 1.作用&#xff1a;Arrays.asList( )方法的作用是将数组转换成List&#xff0c;将List中的全部集合对象添加至ArrayList集合中 2.参数&#xff1a;动态参数 (T... a) 3.返回值&#xff1a;List 集合 List<T> 4.举例&#xff1a; package com…...

物联网和人工智能的融合

物联网和人工智能的融合 1. 物联网和人工智能的融合2. 芯片技术的进步3. 安全和隐私保护挑战4. 软件开发和调试技术的创新5. 自动化和智能化趋势 1. 物联网和人工智能的融合 随着物联网和人工智能技术的快速发展&#xff0c;嵌入式系统将更多地与物联网设备和人工智能算法相结…...

【微信小程序】wxss 和 css 、wxml 和 html 区别

wxss 和 css 区别 wxss 支持小程序特有的选择器和 样式属性 scroll-into-view cover-view 等wxss 引入了 rpx 单位&#xff0c;可以根据屏幕宽度进行自适应&#xff0c;使得开发者可以更方便的处理不同尺寸屏幕的适配问题。wxss 背景图片只能引入外链&#xff0c;不能使用本地…...

python统计分析——使用AIC进行模型选择

参考资料&#xff1a;用python动手学统计学 1、导入库 # 导入库 # 用于数值计算的库 import numpy as np import pandas as pd import scipy as sp from scipy import stats # 用于绘图的库 import matplotlib.pyplot as plt import seaborn as sns sns.set() # 用于估计统计…...

Android 11以上获取不到第三方app是否安装

开年第一篇&#xff0c;处理了一下年前的小问题。 问题&#xff1a;本地app跳转到第三方app地图进行导航&#xff0c;获取不到第三方地图是否安装。 解决&#xff1a; 1.添加包名 This can be done by adding a <queries> element in the Android manifest.在app下的…...

Java的编程之旅24——private私有方法

1.private的介绍 在面向对象编程中&#xff0c;private是一种访问修饰符&#xff0c;用于限制成员的访问范围。私有成员只能在所属的类内部访问&#xff0c;对外部的类或对象是不可见的。 private的使用可以带来以下几个好处&#xff1a; 封装实现细节&#xff1a;私有成员可…...

为什么在MOS管开关电路设计中使用三极管容易烧坏?

MOS管作为一种常用的开关元件&#xff0c;具有低导通电阻、高开关速度和低功耗等优点&#xff0c;因此在许多电子设备中广泛应用。然而&#xff0c;在一些特殊情况下&#xff0c;我们需要在MOS管控制电路中加入三极管来实现一些特殊功能。然而&#xff0c;不同于MOS管&#xff…...

CSS的注释:以“ /* ”开头,以“ */ ”结尾

CSS的注释:以“ /* ”开头&#xff0c;以“*/”结尾 CSS的注释: 以“ /* ”开头&#xff0c;以“ */ ”结尾 在CSS中&#xff0c;注释是一种非常重要的工具&#xff0c;它们可以帮助开发者记录代码的功能、用法或其他重要信息。这些信息对于理解代码、维护代码以及与他人合作都…...

MySQL中常见的几种日志类型【重点】

在MySQL中&#xff0c;有几种不同类型的日志&#xff0c;用于记录数据库的活动和操作&#xff0c;以便于故障排查、性能调优和数据恢复等目的。以下是MySQL中常见的几种日志类型&#xff1a; 错误日志&#xff08;Error Log&#xff09;&#xff1a; 错误日志记录了MySQL服务器…...

odoo16-API(Controller)带有验证访问的接口

odoo16-API&#xff08;Controller&#xff09;带有验证访问的接口 目前我使用odoo原生的登录token来验证登陆的有效性 废话不多说直接上代码 # 测试获取session_id import requests class GetOdooData(http.Controller):def getOdooToken(self):# http://localhost:8123访问…...

Eclipse项目间的引用

我们在开发的时候&#xff0c;有时候需要把一个大的项目打散&#xff0c;尤其是现在微服务的架构很流行&#xff0c;一个大的项目往往被拆成很多小的项目&#xff0c;而有的项目作为公共工程被独立出来&#xff0c;比如有个工程专门提供各种Util工具类&#xff0c;有的工程专门…...

matplotlib使用案例3:通过自定义图例类实现图例的任意方向(行 or 列)的排列

这个方法的核心依然是基于matplotlib.legend._get_legend_handles_labels函数。然后将得到的handlers, labels进行重排,使得即使再调用Legend类的绘制方法对图例进行列排列,最终的效果也是图例的行显示,如[1、2、3、4、5、6],当指定ncols=2,Legend类的绘制方法得到的图例如…...

js设计模式:依赖注入模式

作用: 在对象外部完成两个对象的注入绑定等操作 这样可以将代码解耦,方便维护和扩展 vue中使用use注册其他插件就是在外部创建依赖关系的 示例: class App{constructor(appName,appFun){this.appName appNamethis.appFun appFun}}class Phone{constructor(app) {this.nam…...

【性能最佳实践】事务处理和读写策略原来这么关键!

MongoDB针对初级&#xff0c;中级及熟练的技术开发人员推出系列技术文章与行业案例。深入浅出地剖析MongoDB产品基础原理&#xff0c;使用技巧&#xff0c;典型行业场景及应用&#xff0c;还有Code Demo及线上线下活动推荐&#xff01; 欢迎阅读有关MongoDB性能最佳实践的系列…...

【广度优先搜索】【网格】【割点】【 推荐】1263. 推箱子

作者推荐 视频算法专题 涉及知识点 广度优先搜索 网格 割点 并集查找 LeetCode:1263. 推箱子 「推箱子」是一款风靡全球的益智小游戏&#xff0c;玩家需要将箱子推到仓库中的目标位置。 游戏地图用大小为 m x n 的网格 grid 表示&#xff0c;其中每个元素可以是墙、地板或…...

开店怎么做进销存

开设一家店铺&#xff0c;无论是实体店还是网店&#xff0c;进销存管理都是确保店铺正常运营和盈利的关键环节。一款良好的进销存管理软件可以帮助你更好地掌握库存情况、优化采购策略、提高销售效率&#xff0c;并最终实现盈利目标。那么&#xff0c;开店怎么做进销存管理呢&a…...