版本控制|版本控制 Git基础 RPM打包
版本控制 版本库
- 典型的客户/服务器系统
----任意数量客户端
----客户端通过写数据库分享代码
文章图片
分布式版本控制系统
- 集中式版本控制系统
----所有操作需要联网
- 分布式版本操作系统
----支持断网操作
版本控制软件
- 集中式版本控制软件
----SVN(Subversion)
- 分布式版本控制软件
----BitKeeper(收费)
Git基本概念
- Git仓库:保存所有数据的地方
- 工作区:从仓库中提取出来的文件,放在磁盘上供你使用或更改
- 暂存区:就是一个文件,索引文件,保存了下次将提交的文件列表信息
当我们把一个文件上传到git里,让git帮我们去管理,只要你把文件放到git里了,以后你对这个文件不管怎么修改,它都会把你的文件所有修改的历史记录全部备份下来,可以随意的还原历史版本,简单来说git的作用就是帮你管理文件,对于git来说,这个文件有很多的版本,每修改一次就产生一个版本.
Git工作流程
文章图片
- 从服务器上clone数据到本地,即工作区
- 工作区内存放最新版文件,但是工作区内修改的文件是不能直接提交到GIt仓库
- 暂存区是指你修改所有文件的一个暂时存放的地方,只有修改过的文件才能放到暂存区,再由暂存区提交到仓库
- GIt仓库,即本地仓库. 存放着所有文件的历史版本
- 在联网的情况下把本地仓库所有修改的文件回传到服务器上 .断网的情况下,本地仓库就是你的服务器.
问题
要求先快速搭建好一台Git服务器,并测试该版本控制软件,要求如下:
- 安装Git软件
- 创建版本库
- 客户端克隆版本仓库到本地
- 本地工作目录修改数据
- 提交本地修改到服务器
实验拓扑如图-1所示,Git工作流如图-2所示。
文章图片
步骤一:部署Git服务器(192.168.2.100作为远程git服务器)
1.YUM安装Git软件
[root@web1 ~]# yum -y install git
2.初始化一个空仓库
[root@web1 ~]# mkdir /var/git
[root@web1 ~]# git init /var/git/project --bare
初始化空的 Git 版本库于 /var/git/project/
[root@web1 ~]# ls /var/git/project
configdescriptionHEADhooksinfoobjectsrefs
步骤二:客户端测试(192.168.2.200作为客户端主机)
客户端访问方式
- 本地访问
- 远程ssh访问
- Web
----客户端可以浏览器访问
----git clone http://服务器IP/git仓库
----Git clone https://服务器IP/git仓库
客户端命令行工具:使用git常用指令列表如表-1所示
文章图片
1.clone克隆服务器仓库到本地
[root@web2 ~]# yum-yinstall git#首先查看是否有git软件
[root@web2 ~]# gitcloneroot@192.168.2.100:/var/git/project
正克隆到 'project'...
Warning: Permanently added '192.168.2.100' (ECDSA) to the list of known hosts.
root@192.168.2.100's password:
warning: 您似乎克隆了一个空版本库。
[root@web2 ~]# ls#当前多了一个空的project目录,project即为工作区
Desktoplnmp_softlnmp_soft.tar.gznginx-1.12.2nginx-1.12.2.tar.gzproject
[root@web2 ~]# cd project/
[root@web2 project]# ls
[root@web2 project]# ls-a#隐藏的仓库,存放所有历史版本
....git
!!!做git有关的任何操作一定要先cd进git的工作区
2. 本地工作区对数据进行增删改查(必须要先进入仓库再操作数据)。
[root@web2 project]# echo "init data" > init.txt
[root@web2 project]# mkdir demo
[root@web2 project]# cp /etc/hosts demo
[root@web2 project]# ls
demoinit.txt
3. 查看仓库中数据的状态。
[root@web2 project]# gitstatus
# 位于分支 master
#
# 初始提交
#
# 未跟踪的文件:
#(使用 "git add ..." 以包含要提交的内容)
#
#demo/
#init.txt
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
4. 将工作区的修改提交到暂存区
[root@web2 project]# git add .#.代表当前,所有的文件都提交到暂存区
5 . 修改git配置
[root@web2 project]# gitcommit-m"注释"#提交,报错
[master(根提交) 3ef2e08] 注释
Committer: root
您的姓名和邮件地址基于登录名和主机名进行了自动设置。请检查它们正确
与否。您可以通过下面的命令对其进行明确地设置以免再出现本提示信息:git config --global user.name "Your Name"
git config --global user.email you@example.com设置完毕后,您可以用下面的命令来修正本次提交所使用的用户身份:git commit --amend --reset-author 2 files changed, 3 insertions(+)
create mode 100644 demo/hosts
create mode 100644 init.txt
[root@web2 project]#git config --global user.name "Your Name"#config永久生效
[root@web2 project]#git config --global user.email you@example.com
[root@web2 project]# cat~/.gitconfig
[user]
name = Your Name
email = you@example.com
[root@web2 project]# gitstatus#再次查看服务状态
位于分支 master
无文件要提交,干净的工作区
6.将本地仓库中的数据推送到远程服务器(web2将数据推送到web1)
[root@web2 project]# git config --global push.default simple
[root@web2 project]# git push
root@192.168.2.100's password:输入服务器root密码
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 358 bytes | 0 bytes/s, done.
Total 5 (delta 0), reused 0 (delta 0)
To root@192.168.2.100:/var/git/project
* [new branch]master -> master
[root@web2 project]# git status
位于分支 master
无文件要提交,干净的工作区可以在web1上面查看
[root@web1 ~]# cd/var/git/project/
[root@web1 project]# du-sh /var/git/project/#没有推送到服务器时的大小
56K/var/git/project/
[root@web1 project]# du-sh /var/git/project/#已经推送到服务器时的大小变化
80K/var/git/project/
7. 将服务器上的数据更新到本地(web1的数据更新到web2)
备注:可能其他人也在修改数据并提交服务器,就会导致自己的本地数据为旧数据,使用pull就可以将服务器上新的数据更新到本地。
[root@web2 project]# gitpull
root@192.168.2.100's password:
Already up-to-date.
8 . 查看版本日志
[root@web2 project]# git log#git会以UUID作为版本号,"注释"为commit-m后面定义的名字
commit 3ef2e08e4cabc885025f397bbcf11910b67476f3
Author: root
Date:Fri Jan 17 10:49:07 2020 +0800注释
[root@web2 project]# gitlog --pretty=oneline
3ef2e08e4cabc885025f397bbcf11910b67476f3 注释
[root@web2 project]# gitlog--oneline
3ef2e08 注释
[root@web2 project]# gitreflog
3ef2e08 HEAD@{0}: commit (initial): 注释
Windows客户端软件
备注:客户端也可以使用图形程序访问服务器。
Windows需要安装git和tortoiseGit。如图-3、图-4所示。
文章图片
文章图片
HEAD指针概述
- HEAD指针是一个可以在任何分支和版本移动的指针
- 通过移动指针我们可以将数据还原至任何版本
问题
学习操作HEAD指针,具体要求如下:
- 查看Git版本信息
- 移动指针
- 通过移动HEAD指针恢复数据
- 合并版本
HEAD指针是一个可以在任何分支和版本移动的指针,通过移动指针我们可以将数据还原至任何版本。每做一次提交操作都会导致git更新一个版本,HEAD指针也跟着自动移动。
步骤一:HEAD指针基本操作
1.准备工作(多对数据仓库进行修改、提交操作,以产生多个版本)
[root@web2 project]# echo "first">new.txt
[root@web2 project]# git add .
[root@web2 project]# git commit-m"new.txt:first"
[master 2c87f61] add first
1 file changed, 1 insertion(+)
create mode 100644 first
[root@web2 project]# echo"first">>new.txt
[root@web2 project]# gitadd .
[root@web2 project]# gitcommit -m "new.txt:firstline"
[master a0480de] new.txt:firstline
1 file changed, 2 insertions(+), 1 deletion(-)
[root@web2 project]# echo "second">>new.txt
[root@web2 project]# gitadd .
[root@web2 project]# gitcommit-m "new.txt:second line"
[master 5d777e6] new.txt:second line
1 file changed, 1 insertion(+)
[root@web2 project]# echo "thrid">>new.txt
[root@web2 project]# gitadd .
[root@web2 project]# gitcommit-m "new.txt:thrid"
[master 9e6746d] new.txt:thrid
1 file changed, 1 insertion(+)
[root@web2 project]# gitpush
root@192.168.2.100 password:
[root@web2 project]# echo 123> num.txt
[root@web2 project]# gitadd .
[root@web2 project]# gitcommit-m "num.txt:123"
[master e7db9a7] num.txt:123
1 file changed, 1 insertion(+)
create mode 100644 num.txt
[root@web2 project]# echo 456 >num.txt
[root@web2 project]# gitadd .
[root@web2 project]# gitcommit-m "num.txt:456"
[master ead3f5d] num.txt:456
1 file changed, 1 insertion(+), 1 deletion(-)
[root@web2 project]# echo 789 >num.txt
[root@web2 project]# gitadd .
[root@web2 project]# gitcommit-m "num.txt:789"
[master 553a0eb] num.txt:789
1 file changed, 1 insertion(+), 1 deletion(-)
[root@web2 project]# gitpush
root@192.168.2.100's password:
Counting objects: 10, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (9/9), 673 bytes | 0 bytes/s, done.
Total 9 (delta 3), reused 0 (delta 0)
To root@192.168.2.100:/var/git/project
9e6746d..553a0ebmaster -> master
2.查看Git版本信息
[root@web2 project]# gitlog--oneline
553a0eb num.txt:789
ead3f5d num.txt:456
e7db9a7 num.txt:123
9e6746d new.txt:thrid
5d777e6 new.txt:second line
a0480de new.txt:firstline
2c87f61 add new.txt
3ef2e08 注释
3.移动HEAD指针,将数据还原到任意版本
提示:当前HEAD指针为HEAD@{0}。
- 同步更新:git pull
- 下载: git clone URL
- 提交到暂存区:git add .
- 提交到本地仓库: git commit -m “xxx”
- 提交 :git push
- 创建仓库:在服务端创建文件,git init
【版本控制|版本控制 Git基础 RPM打包】分支可以让开发分多条主线同时进行,每条主线互不影响
- 按功能模块分支,按版本分支
- 分支也可以合并
问题
操作Git分支,具体要求如下:
- 查看分支
- 创建分支
- 切换分支
- 合并分支
- 解决分支的冲突
Git支持按功能模块、时间、版本等标准创建分支,分支可以让开发分多条主线同时进行,每条主线互不影响,分支效果如图所示
文章图片
常见的分支规范如下:
- MASTER分支(MASTER是主分支,是代码的核心)。
- DEVELOP分支(DEVELOP最新开发成果的分支)。
- RELEASE分支(为发布新产品设置的分支)。
- HOTFIX分支(为了修复软件BUG缺陷的分支)。
- FEATURE分支(为开发新功能设置的分支)。
1.查看当前分支
[root@web2 project]# git status
# 位于分支 master
无文件要提交,干净的工作区
nothing to commit, working directory clean
[root@web2 project]# git branch -v
* master 553a0eb num.txt:789
2.创建分支
[root@web2 project]# git branch hotfix
[root@web2 project]# git branch feature
[root@web2 project]# git branch -v
feature 553a0eb num.txt:789
hotfix553a0eb num.txt:789
* master553a0eb num.txt:789
步骤二:切换与合并分支
1.切换分支
[root@web2 project]# git checkouthotfix
切换到分支 'hotfix'
[root@web2 project]# ls#此时查看并没有任何变化
demoinit.txtnew.txtnum.txt
[root@web2 project]# git branch-v
feature 553a0eb num.txt:789
* hotfix553a0eb num.txt:789
master553a0eb num.txt:789
在新的分支上就可以继续修改代码
- 修改文件、创建文件等操作
- 正常add,commit提交版本库
[root@web2 project]# echo"fix a new txt">>new.txt
[root@web2 project]# gitadd .
[root@web2 project]# gitcommit-m"fix a new txt"
[hotfix 4cab02f] fix a new txt
1 file changed, 1 insertion(+)
[root@web2 project]# catnew.txt
first
first
second
thrid
fix a new txt
[root@web2 project]#gitcheckoutmaster
切换到分支 'master'
[root@web2 project]# cat new.txt
first
first
second
thrid
3.将hotfix修改的数据合并到master分支
注意,合并前必须要先切换到master分支,然后再执行merge命令。
[root@web2 project]# git branch -v#首先查看当前处于哪个分支
feature 553a0eb num.txt:789
hotfix4cab02f fix a new txt
* master553a0eb num.txt:789
[root@web2 project]# git mergehotfix#合并分支,有时会产生版本分支冲突
更新 553a0eb..4cab02f
Fast-forward
new.txt | 1 +
1 file changed, 1 insertion(+)
[root@web2 project]# catnew.txt#再次查看文件
first
first
second
thrid
fix a new txt
[root@web2 project]# git branch -v
feature 553a0eb num.txt:789
hotfix4cab02f fix a new txt
* master4cab02f [领先 1] fix a new txt
步骤二:解决版本分支的冲突问题
1.在不同分支中修改相同文件的相同行数据,模拟数据冲突
[root@web2 project]# git checkouthotfix
切换到分支 'hotfix'
[root@web2 project]# echo"AAAA">a.txt
[root@web2 project]# git add .
[root@web2 project]# gitcommit -m"a.txt by hot"
[hotfix cfbfd1f] a.txt by hot
1 file changed, 1 insertion(+)
create mode 100644 a.txt
[root@web2 project]# gitcheckoutmaster
切换到分支 'master'
[root@web2 project]# echo"BBBB"> a.txt
[root@web2 project]# gitadd .
[root@web2 project]# gitcommit -m"a.txt by mas"
[master 108106c] a.txt by mas
1 file changed, 1 insertion(+)
create mode 100644 a.txt
[root@web2 project]# git merge hotfix
自动合并 a.txt
冲突(添加/添加):合并冲突于 a.txt
自动合并失败,修正冲突然后提交修正的结果。
2.查看有冲突的文件内容,修改文件为最终版本的数据,解决冲突
[root@web2 project]# cata.txt#该文件中包含有冲突的内容
<<<<<<< HEAD
BBBB
=======
AAAA
>>>>>>> hotfix
[root@web2 project]# vima.txt#修改该文件,为最终需要的数据,解决冲突
AAAA
[root@web2 project]# gitadd .
[root@web2 project]# git commit -m"fin a.txt"#改为最终版本
[master 87e3f8e] fin a.txt
总结:分支指针与HEAD指针的关系。
创建分支的本质是在当前提交上创建一个可以移动的指针
如何判断当前分支呢?答案是根据HEAD这个特殊指针
分支操作流程如图1,图2,图3,图4,图5所示。
文章图片
HEAD指针指向master分支
文章图片
切换分支,HEAD指针指向testing分支
文章图片
在testing分支中修改并提交代码
文章图片
将分支切换回master分支
文章图片
在master分支中修改数据,更新版本
Git服务器
- SSH协议
- Git协议
- HTTP协议
Git不同的服务器形式,具体要求如下:
- 创建SSH协议服务器
- 创建Git协议服务器
- 创建HTTP协议服务器
Git支持很多服务器协议形式,不同协议的Git服务器,客户端就可以使用不同的形式访问服务器。创建的服务器协议有SSH协议、Git协议、HTTP协议。
步骤一:SSH协议服务器(支持读写操作)
1.创建基于密码验证的SSH协议服务器(web1主机操作)
[root@web1 ~]# git init --bare /var/git/base_ssh
Initialized empty Git repository in /var/git/base_ssh/
2.客户端访问的方式(web2主机操作)
[root@web2 ~]# git clone root@192.168.2.100:/var/git/base_ssh
[root@web2 ~]# rm -rf base_ssh
3.客户端生成SSH密钥,实现免密码登陆git服务器(web2主机操作)
[root@web2 ~]# ssh-keygen -f /root/.ssh/id_rsa -N ''
[root@web2 ~]# ssh-copy-id192.168.2.100
[root@web2 ~]# git clone root@192.168.2.100:/var/git/base_ssh
[root@web2 ~]# git push
步骤二:Git协议服务器(只读操作的服务器)
1.安装git-daemon软件包(web1主机操作)
[root@web1 ~]# yum-yinstallgit-daemon
2.创建版本库(web1主机操作)
[root@web1 ~]# gitinit--bare/var/git/qaqa
初始化空的 Git 版本库于 /var/git/qaqa/
3.修改配置文件,启动git服务(web1主机操作)
[root@web1 ~]# vim /usr/lib/systemd/system/git@.service
修改前内容如下:
ExecStart=-/usr/libexec/git-core/git-daemon --base-path=/var/lib/git
--export-all --user-path=public_git --syslog --inetd –verbose
修改后内容如下:
ExecStart=-/usr/libexec/git-core/git-daemon --base-path=/var/git
--export-all --user-path=public_git --syslog --inetd –verbose
[root@web1 ~]# systemctlstartgit.socket#起服务
4.客户端访问方式(web2主机操作)
[root@web2 project]# cd
[root@web2 ~]# git clone git://192.168.2.100/haha
[root@web2 ~]# ls
Desktophahalnmp_softlnmp_soft.tar.gznginx-1.12.2nginx-1.12.2.tar.gzproject
步骤三:HTTP协议服务器(只读操作的服务器)
1.安装gitweb、httpd软件包(web1主机操作)
[root@web1 ~]# yum -yinstallhttpdgitweb
2.修改配置文件,设置仓库根目录(web1主机操作)
[root@web1 ~]# vim+11/etc/gitweb.conf#+11可以直接跳转到第11行
10 #our $projectroot = "/var/lib/git";
11$projectroot = "/var/git";
#以第十行为模板书写git仓库的路径
12 # Set the list of git base URLs used for URL to where fetch project from, i.e.
3.启动httpd服务器
[root@web1 ~]# systemctl restarthttpd
4.客户端访问方式(web2主机操作)
注意:调用虚拟机中的firefox浏览器,需要在远程时使用ssh -X 服务器IP,并且确保真实主机的firefox已经关闭。
[root@web2 ~]# firefox http://192.168.2.100/git/
文章图片
文章图片
RPM包打包 基本概念
PM(Redhat Package Manager)是用于Redhat、CentOS、Fedora等Linux 分发版(distribution)的常见的软件包管理器。因为它允许分发已编译的软件,所以用户只用一个命令就可以安装软件。
应用场景
- 官方未提供RPM包
- 官方RPM无法定义
- 大量源码包,希望提供统一的软件管理机制
- 准备源码软件
- 安装rpm-build
- 编写编译配置文件
- 编译RPM包
问题
使用nginx-1.12.2版本的源码软件,生成对应的RPM包软件,具体要求如下:代码段 小部件
- 软件名称为nginx
- 软件版本为1.12.2
- RPM软件包可以查询描述信息
- RPM软件包可以安装及卸载
安装rpm-build软件包,编写SPEC配置文件,创建新的RPM软件包。
配置文件中的描述信息如表-2:
文章图片
步骤一:安装rpm-build软件
1.安装rpm-build软件包
[root@web1 ~]# yum-yinstallrpm-build
2.生成rpmbuild目录结构
[root@web1 ~]# rpmbuild-ba xiaotiantian
错误:stat /root/xiaotiantian 失败:没有那个文件或目录
[root@web1 ~]# ls /root/rpmbuild///自动生成的目录结构
BUILDBUILDROOTRPMSSOURCESSPECSSRPMS
#SOURCES目录下存放源码
#RPMS目录,生成的RPM包存放在这里
#SPECS目录下写将源码变成RPM包的配置文件
3.准备工作,将源码软件复制到SOURCES目录
[root@web1 ~]# cp/root/lnmp_soft/nginx-1.12.2.tar.gz/root/rpmbuild/SOURCES/
4.创建并修改SPEC配置文件
[root@web1 ~]# cd /root/rpmbuild/SPECS/
[root@web1 SPECS]# vimnginx.spec#扩展名必须要以spec结尾
Name:nginx#源码包软件名称
Version:1.12.2#源码包软件的版本号
Release:1%{?dist}#制作的RPM包版本号
Summary:this is a web server.#RPM软件的概述
#Group:#软件包组
License:GPL#软件的协议
URL:www.tiantian.com#网址
Source0:nginx-1.12.2.tar.gz#源码包软件的全称
#BuildRequires:#制作RPM时的依赖关系
#Requires:#安装RPM时的依赖关系
%description
this isxiao tian tianohouhouhouhohu#软件的详细描述%post#非必要操作:安装后脚本(创建账户)
useraddnginx
echonginx>/tmp/a.txt
%prep
%setup -q#自动解压源码包,并cd进入目录
%build
./configure--with-http_ssl_module--user=nginx#./configure源码安装
make %{?_sm
步骤二:使用配置文件创建RPM包
[root@web1 SPECS]# ls
nginx.spec
[root@web1 SPECS]# rpmbuild-ba nginx.spec
[root@web1 SPECS]# ls /root/rpmbuild/RPMS/
x86_64
[root@web1 SPECS]# ls /root/rpmbuild/RPMS/x86_64/
nginx-1.12.2-1.el7.centos.x86_64.rpmnginx-debuginfo-1.12.2-1.el7.centos.x86_64.rpm
步骤三:安装软件
[root@web1 ~]# yuminstall/root/rpmbuild/RPMS/x86_64/nginx-1.12.2-1.el7.centos.x86_64.rpm
nginx.x86_64 0:1.12.2-1.el7.centos完毕!
[root@web1 ~]# rpm-qa|grepnginx
nginx-1.12.2-1.el7.centos.x86_64
[root@web1 ~]# ls/usr/local/nginx/
confhtmllogssbin
[root@web1 ~]# yuminfonginx.x86_64
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
已安装的软件包
名称:nginx
架构:x86_64
版本:1.12.2
发布:1.el7.centos
大小:797 k
源:installed
简介: this is a web server.
网址:www.tiantian.com
协议: GPL
描述: this isxiao tian tianohouhouhouhohu
推荐阅读
- gitlab|gitlab 通过备份还原 admin/runner 500 Internal Server Error
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- gitlab|Gitlab升级(12.2.1到14.6.4)
- 我的拖延症如何控制了我,又一次
- 真正的爱
- C语言的版本比较
- [源码解析]|[源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3)
- 常用git命令总结
- 每天听本书《控制焦虑》
- K8S|K8S 生态周报| Istio 即将发布重大安全更新,多个版本受影响