版本控制|版本控制 Git基础 RPM打包

版本控制 版本库

  • 典型的客户/服务器系统
----版本库是版本控制中心的核心
----任意数量客户端
----客户端通过写数据库分享代码

版本控制|版本控制 Git基础 RPM打包
文章图片

分布式版本控制系统
  • 集中式版本控制系统
----开发者之间共用一个仓库(repository)
----所有操作需要联网
  • 分布式版本操作系统
----每个开发者都是一个仓库的完整克隆,每个人都是服务器
----支持断网操作
版本控制软件
  • 集中式版本控制软件
----CVS
----SVN(Subversion)
  • 分布式版本控制软件
----Git
----BitKeeper(收费)
Git基本概念
  • Git仓库:保存所有数据的地方
  • 工作区:从仓库中提取出来的文件,放在磁盘上供你使用或更改
  • 暂存区:就是一个文件,索引文件,保存了下次将提交的文件列表信息
Git作用
当我们把一个文件上传到git里,让git帮我们去管理,只要你把文件放到git里了,以后你对这个文件不管怎么修改,它都会把你的文件所有修改的历史记录全部备份下来,可以随意的还原历史版本,简单来说git的作用就是帮你管理文件,对于git来说,这个文件有很多的版本,每修改一次就产生一个版本.
Git工作流程
版本控制|版本控制 Git基础 RPM打包
文章图片

  1. 从服务器上clone数据到本地,即工作区
  2. 工作区内存放最新版文件,但是工作区内修改的文件是不能直接提交到GIt仓库
  3. 暂存区是指你修改所有文件的一个暂时存放的地方,只有修改过的文件才能放到暂存区,再由暂存区提交到仓库
  4. GIt仓库,即本地仓库. 存放着所有文件的历史版本
  5. 在联网的情况下把本地仓库所有修改的文件回传到服务器上 .断网的情况下,本地仓库就是你的服务器.
Git基本操作
问题
要求先快速搭建好一台Git服务器,并测试该版本控制软件,要求如下:
  • 安装Git软件
  • 创建版本库
  • 客户端克隆版本仓库到本地
  • 本地工作目录修改数据
  • 提交本地修改到服务器
方案
实验拓扑如图-1所示,Git工作流如图-2所示。
版本控制|版本控制 Git基础 RPM打包
文章图片

步骤一:部署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作为客户端主机)
客户端访问方式
  • 本地访问
----gitclone file:///var/git
  • 远程ssh访问
----git clone root@服务器IP:/var/git
  • Web
----服务器需要额外配置Web服务器
----客户端可以浏览器访问
----git clone http://服务器IP/git仓库
----Git clone https://服务器IP/git仓库
客户端命令行工具:使用git常用指令列表如表-1所示
版本控制|版本控制 Git基础 RPM打包
文章图片

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所示。

版本控制|版本控制 Git基础 RPM打包
文章图片


版本控制|版本控制 Git基础 RPM打包
文章图片

HEAD指针概述
  • 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分支,具体要求如下:
  • 查看分支
  • 创建分支
  • 切换分支
  • 合并分支
  • 解决分支的冲突
方案
Git支持按功能模块、时间、版本等标准创建分支,分支可以让开发分多条主线同时进行,每条主线互不影响,分支效果如图所示
版本控制|版本控制 Git基础 RPM打包
文章图片

常见的分支规范如下:
  • 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提交版本库
2.在新的分支上可以继续进行数据操作(增、删、改、查)
[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所示。

版本控制|版本控制 Git基础 RPM打包
文章图片

HEAD指针指向master分支
版本控制|版本控制 Git基础 RPM打包
文章图片

切换分支,HEAD指针指向testing分支
版本控制|版本控制 Git基础 RPM打包
文章图片

在testing分支中修改并提交代码
版本控制|版本控制 Git基础 RPM打包
文章图片

将分支切换回master分支
版本控制|版本控制 Git基础 RPM打包
文章图片

在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/

版本控制|版本控制 Git基础 RPM打包
文章图片

版本控制|版本控制 Git基础 RPM打包
文章图片

RPM包打包 基本概念
PM(Redhat Package Manager)是用于Redhat、CentOS、Fedora等Linux 分发版(distribution)的常见的软件包管理器。因为它允许分发已编译的软件,所以用户只用一个命令就可以安装软件。
应用场景
  • 官方未提供RPM包
  • 官方RPM无法定义
  • 大量源码包,希望提供统一的软件管理机制
打包流程
  • 准备源码软件
  • 安装rpm-build
  • 编写编译配置文件
  • 编译RPM包
制作nginx的RPM包
问题
使用nginx-1.12.2版本的源码软件,生成对应的RPM包软件,具体要求如下:代码段 小部件
  • 软件名称为nginx
  • 软件版本为1.12.2
  • RPM软件包可以查询描述信息
  • RPM软件包可以安装及卸载
方案
安装rpm-build软件包,编写SPEC配置文件,创建新的RPM软件包。
配置文件中的描述信息如表-2:
版本控制|版本控制 Git基础 RPM打包
文章图片

步骤一:安装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


    推荐阅读