版本控制 Git基础 RPM打包

版本控制

版本库

  • 典型的客户/服务器系统

----版本库是版本控制中心的核心
----任意数量客户端
----客户端通过写数据库分享代码

 

版本控制 Git基础 RPM打包_第1张图片

分布式版本控制系统

  • 集中式版本控制系统

----开发者之间共用一个仓库(repository)
----所有操作需要联网

  • 分布式版本操作系统

----每个开发者都是一个仓库的完整克隆,每个人都是服务器
----支持断网操作
版本控制软件

  • 集中式版本控制软件

----CVS
----SVN(Subversion)

  • 分布式版本控制软件

----Git
----BitKeeper(收费)
Git基本概念

  • Git仓库:保存所有数据的地方
  • 工作区:从仓库中提取出来的文件,放在磁盘上供你使用或更改
  • 暂存区:就是一个文件,索引文件,保存了下次将提交的文件列表信息

Git作用

当我们把一个文件上传到git里,让git帮我们去管理,只要你把文件放到git里了,以后你对这个文件不管怎么修改,它都会把你的文件所有修改的历史记录全部备份下来,可以随意的还原历史版本,简单来说git的作用就是帮你管理文件,对于git来说,这个文件有很多的版本,每修改一次就产生一个版本.

Git工作流程

版本控制 Git基础 RPM打包_第2张图片

  1. 从服务器上clone数据到本地,即工作区
  2. 工作区内存放最新版文件,但是工作区内修改的文件是不能直接提交到GIt仓库
  3. 暂存区是指你修改所有文件的一个暂时存放的地方,只有修改过的文件才能放到暂存区,再由暂存区提交到仓库
  4. GIt仓库,即本地仓库. 存放着所有文件的历史版本
  5. 在联网的情况下把本地仓库所有修改的文件回传到服务器上 .断网的情况下,本地仓库就是你的服务器.

Git基本操作

问题
要求先快速搭建好一台Git服务器,并测试该版本控制软件,要求如下:

  • 安装Git软件
  • 创建版本库
  • 客户端克隆版本仓库到本地
  • 本地工作目录修改数据
  • 提交本地修改到服务器

方案
实验拓扑如图-1所示,Git工作流如图-2所示。

版本控制 Git基础 RPM打包_第3张图片

步骤一:部署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
config  description  HEAD  hooks  info  objects  refs   

步骤二:客户端测试(192.168.2.200作为客户端主机)

客户端访问方式

  • 本地访问

----git  clone 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打包_第4张图片

1.clone克隆服务器仓库到本地

[root@web2 ~]# yum  -y  install git                                  #首先查看是否有git软件
[root@web2 ~]# git  clone  [email protected]:/var/git/project
正克隆到 'project'...
Warning: Permanently added '192.168.2.100' (ECDSA) to the list of known hosts.
[email protected]'s password: 
warning: 您似乎克隆了一个空版本库。
[root@web2 ~]# ls                                               #当前多了一个空的project目录,project即为工作区
Desktop  lnmp_soft  lnmp_soft.tar.gz  nginx-1.12.2  nginx-1.12.2.tar.gz    project
[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
demo  init.txt

3. 查看仓库中数据的状态。

[root@web2 project]# git  status
# 位于分支 master
#
# 初始提交
#
# 未跟踪的文件:
#   (使用 "git add ..." 以包含要提交的内容)
#
#    demo/
#    init.txt
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

4. 将工作区的修改提交到暂存区

[root@web2 project]# git add .     #.代表当前,所有的文件都提交到暂存区

5 . 修改git配置

[root@web2 project]# git  commit  -m  "注释"                #提交,报错
[master(根提交) 3ef2e08] 注释
 Committer: root 
您的姓名和邮件地址基于登录名和主机名进行了自动设置。请检查它们正确
与否。您可以通过下面的命令对其进行明确地设置以免再出现本提示信息:

    git config --global user.name "Your Name"
    git config --global user.email [email protected]

设置完毕后,您可以用下面的命令来修正本次提交所使用的用户身份:

    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 [email protected]
[root@web2 project]# cat  ~/.gitconfig
[user]
    name = Your Name
    email = [email protected]
[root@web2 project]# git  status                        #再次查看服务状态
位于分支 master
无文件要提交,干净的工作区

6.将本地仓库中的数据推送到远程服务器(web2将数据推送到web1)

[root@web2 project]# git config --global push.default simple
[root@web2 project]# git push
[email protected]'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 [email protected]:/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]# git  pull
[email protected]'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]# git  log --pretty=oneline
3ef2e08e4cabc885025f397bbcf11910b67476f3 注释
[root@web2 project]# git  log  --oneline 
3ef2e08 注释
[root@web2 project]# git  reflog
3ef2e08 HEAD@{0}: commit (initial): 注释

Windows客户端软件

备注:客户端也可以使用图形程序访问服务器。
Windows需要安装git和tortoiseGit。如图-3、图-4所示。

 

版本控制 Git基础 RPM打包_第5张图片

 

版本控制 Git基础 RPM打包_第6张图片

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]# git  add .
[root@web2 project]# git  commit -m "new.txt:first  line"
[master a0480de] new.txt:first  line
 1 file changed, 2 insertions(+), 1 deletion(-)
[root@web2 project]# echo "second"  >>  new.txt
[root@web2 project]# git  add .
[root@web2 project]# git  commit  -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]# git  add .
[root@web2 project]# git  commit  -m "new.txt:thrid"
[master 9e6746d] new.txt:thrid
 1 file changed, 1 insertion(+)
[root@web2 project]# git  push 
[email protected] password: 
[root@web2 project]# echo 123  > num.txt
[root@web2 project]# git  add .
[root@web2 project]# git  commit  -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]# git  add .
[root@web2 project]# git  commit  -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]# git  add .
[root@web2 project]# git  commit  -m "num.txt:789"
[master 553a0eb] num.txt:789
 1 file changed, 1 insertion(+), 1 deletion(-)
[root@web2 project]# git  push 
[email protected]'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 [email protected]:/var/git/project
9e6746d..553a0eb  master -> master

2.查看Git版本信息

[root@web2 project]# git  log  --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:first  line
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分支操作

问题
操作Git分支,具体要求如下:

  • 查看分支
  • 创建分支
  • 切换分支
  • 合并分支
  • 解决分支的冲突

方案
Git支持按功能模块、时间、版本等标准创建分支,分支可以让开发分多条主线同时进行,每条主线互不影响,分支效果如图所示

版本控制 Git基础 RPM打包_第7张图片
常见的分支规范如下:

  • 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
  hotfix  553a0eb num.txt:789
* master  553a0eb num.txt:789

步骤二:切换与合并分支
1.切换分支

[root@web2 project]# git checkout   hotfix
切换到分支 'hotfix'
[root@web2 project]# ls                             #此时查看并没有任何变化
demo  init.txt  new.txt  num.txt
[root@web2 project]# git branch  -v
  feature 553a0eb num.txt:789
* hotfix  553a0eb num.txt:789
  master  553a0eb num.txt:789

在新的分支上就可以继续修改代码

  • 修改文件、创建文件等操作
  • 正常add,commit提交版本库

2.在新的分支上可以继续进行数据操作(增、删、改、查)

[root@web2 project]# echo  "fix a new txt"  >>  new.txt
[root@web2 project]# git  add .
[root@web2 project]# git  commit  -m  "fix a new txt"  
[hotfix 4cab02f] fix a new txt
 1 file changed, 1 insertion(+)
[root@web2 project]# cat  new.txt 
first
first
second
thrid
fix a new txt
[root@web2 project]#  git   checkout  master 
切换到分支 '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
  hotfix  4cab02f fix a new txt
* master  553a0eb num.txt:789
[root@web2 project]# git merge  hotfix         #合并分支,有时会产生版本分支冲突
更新 553a0eb..4cab02f
Fast-forward
 new.txt | 1 +
 1 file changed, 1 insertion(+)
[root@web2 project]# cat  new.txt            #再次查看文件
first
first
second
thrid
fix a new txt
[root@web2 project]# git branch -v
  feature 553a0eb num.txt:789
  hotfix  4cab02f fix a new txt
* master  4cab02f [领先 1] fix a new txt

步骤二:解决版本分支的冲突问题
1.在不同分支中修改相同文件的相同行数据,模拟数据冲突

[root@web2 project]# git checkout  hotfix
切换到分支 'hotfix'
[root@web2 project]# echo  "AAAA"  >  a.txt
[root@web2 project]# git add .
[root@web2 project]# git  commit -m  "a.txt by hot"
[hotfix cfbfd1f] a.txt by hot
 1 file changed, 1 insertion(+)
 create mode 100644 a.txt
[root@web2 project]# git  checkout  master 
切换到分支 'master'
[root@web2 project]# echo  "BBBB"  > a.txt  
[root@web2 project]# git  add .
[root@web2 project]# git  commit -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]# cat  a.txt                            #该文件中包含有冲突的内容
<<<<<<< HEAD
BBBB
=======
AAAA
>>>>>>> hotfix
[root@web2 project]# vim  a.txt                         #修改该文件,为最终需要的数据,解决冲突
AAAA
[root@web2 project]# git  add .
[root@web2 project]# git commit -m  "fin a.txt"              #改为最终版本
[master 87e3f8e] fin a.txt

总结:分支指针与HEAD指针的关系。
    创建分支的本质是在当前提交上创建一个可以移动的指针
    如何判断当前分支呢?答案是根据HEAD这个特殊指针

分支操作流程如图1,图2,图3,图4,图5所示。

 

版本控制 Git基础 RPM打包_第8张图片

HEAD指针指向master分支

版本控制 Git基础 RPM打包_第9张图片

切换分支,HEAD指针指向testing分支

版本控制 Git基础 RPM打包_第10张图片

在testing分支中修改并提交代码

版本控制 Git基础 RPM打包_第11张图片

将分支切换回master分支

版本控制 Git基础 RPM打包_第12张图片

在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 [email protected]:/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-id  192.168.2.100
[root@web2 ~]# git clone [email protected]:/var/git/base_ssh
[root@web2 ~]# git push

步骤二:Git协议服务器(只读操作的服务器)
1.安装git-daemon软件包(web1主机操作)

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

2.创建版本库(web1主机操作)

[root@web1 ~]# git  init  --bare  /var/git/qaqa
初始化空的 Git 版本库于 /var/git/qaqa/

3.修改配置文件,启动git服务(web1主机操作)

[root@web1 ~]# vim /usr/lib/systemd/system/[email protected]
修改前内容如下:
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 ~]# systemctl  start  git.socket           #起服务

4.客户端访问方式(web2主机操作)

[root@web2 project]# cd 
[root@web2 ~]# git clone git://192.168.2.100/haha
[root@web2 ~]# ls
Desktop  haha  lnmp_soft  lnmp_soft.tar.gz  nginx-1.12.2  nginx-1.12.2.tar.gz  project

步骤三:HTTP协议服务器(只读操作的服务器)

1.安装gitweb、httpd软件包(web1主机操作)

[root@web1 ~]# yum -y  install  httpd  gitweb

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 restart  httpd

4.客户端访问方式(web2主机操作)
注意:调用虚拟机中的firefox浏览器,需要在远程时使用ssh -X 服务器IP,并且确保真实主机的firefox已经关闭。

[root@web2 ~]# firefox http://192.168.2.100/git/

版本控制 Git基础 RPM打包_第13张图片

版本控制 Git基础 RPM打包_第14张图片

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打包_第15张图片

步骤一:安装rpm-build软件
1.安装rpm-build软件包

[root@web1 ~]# yum  -y  install  rpm-build

2.生成rpmbuild目录结构

[root@web1 ~]# rpmbuild  -ba xiaotiantian         
错误:stat /root/xiaotiantian 失败:没有那个文件或目录
[root@web1 ~]# ls /root/rpmbuild/                                    //自动生成的目录结构
BUILD  BUILDROOT  RPMS  SOURCES  SPECS  SRPMS
#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]# vim  nginx.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 is  xiao tian tian  ohouhouhouhohu               #软件的详细描述

%post                                                 #非必要操作:安装后脚本(创建账户)
useradd  nginx
echo  nginx  >  /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.rpm  nginx-debuginfo-1.12.2-1.el7.centos.x86_64.rpm

步骤三:安装软件

[root@web1 ~]# yum  install  /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  |  grep  nginx
nginx-1.12.2-1.el7.centos.x86_64
[root@web1 ~]# ls  /usr/local/nginx/
conf  html  logs  sbin
[root@web1 ~]# yum  info  nginx.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 is  xiao tian tian  ohouhouhouhohu

 

你可能感兴趣的:(版本控制 Git基础 RPM打包)