107-版本控制
概述
简介
version control system(版本控制系统)
revision control system (修订控制系统)
- 开发工具,但不仅限于源码文件
- 记录文件的每次变更
- 随时可以回到历史状态
- 文件以及元数据的变更(修改人、修改理由、具体修改内容、时间戳)
- 配置文件是除数据之外第二大资产
- 团队写作
分类
指针指向当前最新版本
随着回滚还原历史版本
Git
- 最初由Linux内核创始人开发
- Git作为开发工具而生
- 适合大型项目的版本管理
- Git库保存所有程序员的团队成果
- Git默认使用OpenSSH
- 服务器上的Git用户需要能够修改目录(库)
- 一个库就是一个文件夹(库配置信息:
.git
目录)
- 无需独立的专职服务器,满足存储空间需求可共用
- github目前世界上最大的代码托管服务商(已被微软收购)
服务端
安装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 1. ubuntu自带的(和git自带的版本不一样,不是最新的)
# sudo -s 把自己提升成root权限,后面就不用输入sudo了
apt install git
mkdir /git # 创建一个文件夹(后续作为一些git库的存放位置)
chown xps:xps /git
cd /git
git init --bare apache2 # 创建一个裸库,名字叫apache2(空的框架库,不存在数据)
/var/log/auth.log # ssh登录问题诊断
# 2.使用ppa库方式安装
sudo add-apt-repository ppa:git-core/ppa
sudo apt update
sudo apt install git
git version # 版本比ubuntu库中的新
然后和上面一样创建存放git库的目录
|
客户端
使用
1
2
3
4
5
6
7
8
9
10
11
12
|
# 客户端和服务端都是安装的同一个git软件包
# 其实客户端本身也可以作为一个本地的git服务器
# 基本配置
git config --global user.name "Your Name"
git config --global user.email "eamail@domain.com"
git config --list # 查看配置信息
git help # 查看常用的git二级命令
git help -a # 查看所有的子命令
git help -g # 查看所有的子命令, 并有描述
git help everyday # man giteveryday 查看具体某一个子命令的用法
|
git客户端连接服务器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
mkdir /git # 同样创建一个文件夹
chown xps:xps /git
cd /git
# 作为客户端,从远程服务端clone库(是服务端的绝对路径)
git clone xps@192.168.0.105:/git/web
# .git目录存放配置信息(使之成为git库),删除此目录就是一个普通文件夹
# 其中config文件包含远程服务器地址信息(写好之后以后就不用手动输入信息;)
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = xps@192.168.0.105:/git/web
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
|
常用git命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
# 查看状态
git status
# 追加变更到git的追踪
git add . # 所有文件
git add file_name # 指定文件
# 提交变更给本地git库
git commit -a -m "第一次提交"
# 同步到服务器(orign等在config文件已经写好了)
# 提交之前必须服务器的内容是最新的版本,先git pull, 再push
git push orign master
# 从服务器更新
git pull # 服务端数据存储结构与客户端不同(数据库)
# 撤销文件的变更(不仅仅对文件,对版本也可撤销)
git checkout <file> # 回退最近的版本
# 比对来查看文件的修改变化
git diff index.html
# 内容(对比的两个文件)
--- a/4.conf
+++ b/4.conf
########### 切回历史上任何一个版本
apt install tig # 方法很多,这里使用了tig
tig # 直接查看历史版本(移动到版本上,下面会有版本号hash值),回车会看到具体变更内容
git checkout ddwe23e353c0d6665406e7c07djaoid2d # 切回到指定版本
# 只是指针临时指向了之前的版本,没显示后面的版本(但是后面的版本还是存在的)
# 如果验证没问题,先回到最新状态
git checkout master
# 回滚(只是回滚那一个版本的所做的变更, 不是回退到那,也不影响之后的版本) --> 从当前最新版本的基础山,去掉前面某一个版本中所做的变更
git revert master ddwe23e353c0d6665406e7c07djaoid2d
|
不仅仅的对代码,对配置文件也可以
是个好习惯
1
2
3
4
5
6
7
8
9
|
# 例子 :apache的配置文件
cp -rp /etc/apache2 /etc/apache2.bak
mv /etc/apache2/* /git/apache2
rm /etc/apache2 # 这里千万不能重启
find /git/apache2 -name '.?*' -prune -o -exec chown root:root {} + # 排除.git(.?*),其他的都改为root
ln -s /git/apache2 /etc/apache2 # 做个软链接(可以让应用读取到配置文件)
systemctl reload apache2
# 以后修改就在git仓库修改,并进行add和commit和push,以便出问题回滚
|
Github
开源项目可以使用,前面自己在服务器搭建的git服务器可以自己公司用(商用的肯定要自己内部建版本控制服务器)
机密&隐私信息不建议放到开源平台
创建并同步新库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
## 1.在本地新建(已有库),然后关联到github仓库
echo "# new" >> README.md
git init
git add README.md
git commit -m "first"
git remote add origin https://github.com/xps/new.git # 连接远程仓库,同步现有库
git pull # 先把服务器的版本同步到本地,然后才能正常提交
git push -u origin master # 提交到远程github仓库
# 如果要用ssh协议, 要在github的仓库的setting的的Deploy Key
# 然后本地 .ssd/id_rsa.pub 公钥粘贴上去
# 然后就不用输入密码了
## 2.在github新建,然后clone下来,再提交
|
GitHub pages
通过github上传页面文件建站(目前只是静态的)
1
2
3
4
5
6
7
8
9
10
11
|
# 新建库名为: user_name.github.io
# 现在本地创建已有库也行(参照同步到github库)
git clone https://github.com/user_name.github.io
cd user_name.github.io/
echo "hello world" > index.html # 可以在本地设置好页面(静态网站),再上传
git add .
git commit -m "init commit"
git remote add origin https://github.com/user_name.github.io
git push -u origin master
# 浏览器访问 https://user_name.github.io
|
SSH Key连接库
1
2
3
|
Clonr or Download -> CLone with SSH
Setting -> Deploy keys -> Add
git clone git @github.com:xps/test.git
|
GitLab
GitLab是开源的Git库Web界面(包含团队写协作工具 GitLab mattermost ->即时聊天沟通的)
基于Ruby语言开发的Web应用程序
所有组件全部打包集成(Postgresql, redis, nginx, logrotate, Sidekiq, Unicron)
如果想要要支持MySQL数据库,社区版需要手动安装
安装需求
1
|
最小:单核,1GB,适当存储空间(400MB),100用户以下(建议双核、2GB以上)
|
安装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
### 集成安装方式
https://packages.gitlab.com/gitlab/gitlab-ce/
# ubuntu(安装软件源)
curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
# 开始安装(等待时间比较长)
sudo apt install gitlab-ce
# 自动初始化配置
sudo gitlab-ctl reconfigure
# 查看状态
sudo gitlab-ctl status
# 然后就可以访问了, 设置初始root帐号密码
# 默认是只有一个root管理员
# 和github等的使用体验是类似的
|
配置
1
2
3
4
5
6
7
8
9
10
11
|
/etc/gitlab/gitlab.rb # 配置文件
external_url # 指定访问域名(也可以启用https)
letsencrypt 也集成了 # 免费https
database # 指定外部PosgreSQL数据库
email # 设置出站邮件服务器(注册帐号链接等)
sudo gitlab-ctl reconfigure # 每次修改后都要重新配置
fitlab-ctl show-config # 显示已经启用的配置
sudo gitlab-ctl status
|
常用命令
1
2
3
4
5
6
7
8
|
sudo gitlab-ctl status # 查看状态
sudo gitlab-ctl stop # 停止gitlab
sudo gitlab-ctl start # 启动gitlab
sudo gitlab-ctl restart # 重启gitlab
sudo gitlab-ctl tail # 查看所有日志
sudo gitlab-ctl tail nginx/gitlab_access.log # 查看nginx访问日志
sudo gitlab-ctl tail postgresql # 查看postgresql访问日志
|
新建用户帐号
F1: 管理员登录 -> 扳手图标(全局设置) -> 用户
1
2
3
|
普通用户的创建库的限制一般设置为0
创建帐号的时候不能设置密码(是发送邮件他自己设置),但是创建完成之后再次点击用户就可以修改密码了
|
F2: 默认是支持普通用户自助注册的(不建议,因为一般是在企业内部使用)
1
2
3
4
5
|
# 限制/禁用普通用户自助注册
管理员登录 -> 扳手图标(全局设置) -> Setting
Sign-up Restrictions(注册限制) -> Sign-up enable 不选中 # 禁用自助;只允许手动创建帐号
Send confirmation email on sign-up -> 指定邮箱域名白名单(*.lab.com)
Doamin Blacklist -> 设置黑名单
|
建库
设置(私有,内部,公开) -> 选择库成员(设置–>成员->设置用户权限和期限),clone,同步
默认是http协议访问,可以改为ssh公钥访问
一定程度上支持中文(settings -> Perferences -> Language)
普通用户第一次登录也要重新设置密码,
就可以在本地clone项目库,
然后就可以同步了(其他步骤同github)
用户设置 – Profile
1
2
3
4
|
邮件,名称(给别人看,方式穷举暴力破解)
# 用户资料
full name 修改
email 修改, 且不公开
|
帐号名称
1
2
3
|
Account -> root修改为别的 # 安全
# 帐号(路径这里才是)
修改得隐蔽一点
|
SSH Key
1
2
3
|
ssh-keygen # 现在本机生成公钥
~/.ssh/id_rsa.pub # 生成的公钥
Add Key # 拷贝公钥到gitlab的key的地方
|
禁止普通用户建库
1
2
3
|
设置用户可创建0个库(Project)
Accoumt and Limit Settings -> Default projects limit -> 0
|
Let’s Encrypt证书更新
1
2
3
4
5
6
|
# 自动更新时间
vim /etc/gitlab/gitlab.rb
letsencrypt['auto_renew'] = true # 开启自动更新
letsencrypt['auto_renew_hour'] = "12" # 每12个小时
letsencrypt['auto_renew_minute'] = "30" # 30分钟
letsencrypt['auto_renew_day_of_month'] = "*/7" # 每隔7天
|