版本控制

版本库

典型的客户/服务器系统
  • 版本库是版本控制中心的核心
  • 任意数量客户端
  • 客户端通过写数据库分享代码
版本控制系统
集中式版本控制系统
  • 开发者之间共用一个仓库(repository)
  • 所有操作需要联网
分布式版本操作系统
  • 每个开发者都是一个仓库的完整克隆,每个人都是服务器
  • 支持断网操作
版本控制软件
  • 集中式版本控制软件
    CVS
    SVN(Subversion)
  • 分布式版本控制软件
    Git
    BitKeeper(收费)

Git基本概念

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

Git作用

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

Git工作流程


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

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
config  description  HEAD  hooks  info  objects  refs
  • 步骤二:客户端测试(192.168.2.200作为客户端主机)
    使用git常用指令列表如表-1所示。

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

  1. clone克隆服务器仓库到本地。
[root@web2 ~]# yum  -y  install git                                  #首先查看是否有git软件
[root@web2 ~]# git  clone  root@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即为工作区
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 <file>..." 以包含要提交的内容)
#
#   demo/
#   init.txt
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

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

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

5 ) 修改git配置。

[root@web2 project]# git  commit  -m  "注释"                #提交,报错
[master(根提交) 3ef2e08] 注释Committer: root <root@web2.example.com>
您的姓名和邮件地址基于登录名和主机名进行了自动设置。请检查它们正确
与否。您可以通过下面的命令对其进行明确地设置以免再出现本提示信息:git config --global user.name "Your Name"git config --global user.email you@example.com设置完毕后,您可以用下面的命令来修正本次提交所使用的用户身份:git commit --amend --reset-author2 files changed, 3 insertions(+)create mode 100644 demo/hostscreate 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 Nameemail = you@example.com
[root@web2 project]# git  status                        #再次查看服务状态
位于分支 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]# git  pull
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 <root@web2.example.com>
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需要安装git和tortoiseGit。如图-3、图-4所示。

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 first1 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  line1 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 line1 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:thrid1 file changed, 1 insertion(+)
[root@web2 project]# git  push
root@192.168.2.100 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:1231 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:4561 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:7891 file changed, 1 insertion(+), 1 deletion(-)
[root@web2 project]# git  push
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..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}。

[root@web2 project]# git reflog                   #查看当前的log
553a0eb HEAD@{0}: commit: num.txt:789
ead3f5d HEAD@{1}: commit: num.txt:456
e7db9a7 HEAD@{2}: commit: num.txt:123
9e6746d HEAD@{3}: commit: new.txt:thrid
5d777e6 HEAD@{4}: commit: new.txt:second line
a0480de HEAD@{5}: commit: new.txt:first line
2c87f61 HEAD@{6}: commit: add new.txt
3ef2e08 HEAD@{7}: commit (initial): 注释
[root@web2 project]# git  reset  --hard  5d77        #移动
HEAD 现在位于 5d777e6 new.txt:second line
[root@web2 project]# ls
demo  init.txt  new.txt
[root@web2 project]# cat new.txt
first
first
second
[root@web2 project]# git  reflog                        #查看指针移动历史
5d777e6 HEAD@{0}: reset: moving to 5d77
553a0eb HEAD@{1}: commit: num.txt:789
ead3f5d HEAD@{2}: commit: num.txt:456
e7db9a7 HEAD@{3}: commit: num.txt:123
9e6746d HEAD@{4}: commit: new.txt:thrid
5d777e6 HEAD@{5}: commit: new.txt:second line
a0480de HEAD@{6}: commit: new.txt:first line
2c87f61 HEAD@{7}: commit: add new.txt
3ef2e08 HEAD@{8}: commit (initial): 注释
[root@web2 project]# git  reset --hard  e7db
HEAD 现在位于 e7db9a7 num.txt:123
[root@web2 project]# ls
demo  init.txt  new.txt  num.txt
[root@web2 project]# cat new.txt
first
first
second
thrid
[root@web2 project]# cat num.txt
123
-----------------------------------------------------------------------------------------
会出现报错问题,因为当前的版本低于服务器中的版本
[root@web2 project]# cp  new.txt  /tmp
[root@web2 project]# git  push
root@192.168.2.100s password:
To root@192.168.2.100:/var/git/project! [rejected]        master -> master (non-fast-forward)
error: 无法推送一些引用到 'root@192.168.2.100:/var/git/project'
提示:更新被拒绝,因为您当前分支的最新提交落后于其对应的远程分支。
提示:再次推送前,先与远程变更合并(如 'git pull')。详见
提示:'git push --help' 中的 'Note about fast-forwards' 小节。
-----------------------------------------------------------------------------------------
[root@web2 project]# git  reset  --hard  553a            #回到最后一次修改的版本
HEAD 现在位于 553a0eb num.txt:789
[root@web2 project]# git  reflog
553a0eb HEAD@{0}: reset: moving to 553a
e7db9a7 HEAD@{1}: reset: moving to e7db
5d777e6 HEAD@{2}: reset: moving to 5d77
553a0eb HEAD@{3}: commit: num.txt:789
ead3f5d HEAD@{4}: commit: num.txt:456
e7db9a7 HEAD@{5}: commit: num.txt:123
9e6746d HEAD@{6}: commit: new.txt:thrid
5d777e6 HEAD@{7}: commit: new.txt:second line
a0480de HEAD@{8}: commit: new.txt:first line
2c87f61 HEAD@{9}: commit: add new.txt
3ef2e08 HEAD@{10}: commit (initial): 注释
[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 注释

同步更新:git pull
下载: git clone URL
提交到暂存区:git add .
提交到本地仓库: git commit -m “xxx”
提交 :git push
创建仓库:在服务端创建文件,git init

分支的基本概念

分支可以让开发分多条主线同时进行,每条主线互不影响

  • 按功能模块分支,按版本分支
  • 分支也可以合并

Git分支操作

问题
操作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 -vfeature 553a0eb num.txt:789hotfix  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  -vfeature 553a0eb num.txt:789
* hotfix  553a0eb num.txt:789master  553a0eb num.txt:789

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 txt1 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:789hotfix  4cab02f fix a new txt
* master  553a0eb num.txt:789
[root@web2 project]# git merge  hotfix         #合并分支,有时会产生版本分支冲突
更新 553a0eb..4cab02f
Fast-forwardnew.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 -vfeature 553a0eb num.txt:789hotfix  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 hot1 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 mas1 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所示。

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-id  192.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  -y  install  git-daemon

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

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

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 ~]# 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/



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:

步骤

  • 步骤一:安装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 %{?_smp_mflags}
%install
make install DESTDIR=%{buildroot}
%files
%doc                                                  #对哪些文件与目录打包
/usr/local/nginx/*
%changelog
  • 步骤二:使用配置文件创建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.rpmnginx.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打包相关推荐

  1. RPM打包原理、示例、详解及备查

    原文地址:https://blog.csdn.net/qq_16542775/article/details/80961213 RPM(Redhat Package Manager)是用于Redhat ...

  2. 删除隐藏版本信息 版本回退_Git系列之-分布式版本控制Git详解

    课程简介: 课程目标:通过本课程的学习,将全面掌握Git版本管理工具的配置与使用,以适应工作的需要. 适用人群:具有一定开发基础的开发人员. 课程概述:Git (读音为/gɪt/)是一个开源的分布式版 ...

  3. 嵌入式Linux入门4:版本控制git的使用

    本文介绍版本控制git的使用.git的使用,网络上有很多资料,笔者使用git多年,因此本文列出简单操作命令,顺便说一说使用经验. 一.Windows篇 由于嵌入式Linux使用的uboot.kerne ...

  4. 用 RPM 打包软件,第 2 部分

    在不具备 root 权限的情况下构建.给软件打补丁和分发 RPM RPM 是一种广泛用于发布 Linux 软件的工具: 用户可以轻松地安装用 RPM 打包的产品.在本文(该系列文章的第 2 篇)中,D ...

  5. 使用RPM打包QT程序

    本文章只是一个RPM打包的一个小例子,仅适合初学者参考! 先说一下使用RPM打包的步骤: 一.首先将写好的内容使用tar压缩成.tar.gz格式 二.创建所需的目录并配置rpm打包目录 使用rpm打包 ...

  6. rpm打包的流程包括以下哪些_Linux下RPM打包流程分享

    本文主要和大家分享Linux下RPM打包流程,希望能帮助到大家. 开始前的准备 安装rpmbuild软件包yum -y install rpm-build 生成相关目录 要生成rpm相关目录,可以手动 ...

  7. RPM打包原理spec

    概述 RPM(Redhat Package Manager)是用于Redhat.CentOS.Fedora等Linux 分发版(distribution)的常见的软件包管理器.因为它允许分发已编译的软 ...

  8. RPM打包探索(rpm-max翻译整理)

    1. %global 和 %define 的区别? 这是内置宏,%define用来定义宏,%global用来定义一个全局可见的宏(在整个spec文件中可见) 2. %{!?macro-name} 和 ...

  9. vpp源码框架的rpm打包、安装、启动1

    给vpp框架代码 rpm 打包,可参考: vpp rpm 官网 可能由于天朝网络的原因墙内很多人可能看不到,即使能看到也是长长的一页英文,个人感觉很多步骤都时比较废柴的.故此直接总结一下,如果大家是初 ...

最新文章

  1. C# System.Guid.NewGuid() 格式化
  2. 【AI初识境】被Hinton,DeepMind和斯坦福嫌弃的池化,到底是什么?​​​​​​​
  3. Scala IDE for Eclipse的下载、安装和WordCount的初步使用(本地模式和集群模式)
  4. 2019升职加薪必备:你一定要修炼的产品思维
  5. 解除隐藏文件cmd命令_Win10用cmd命令隐藏文件|Win10相互转换隐藏真实文件
  6. python xmlns 解析_使用python读取标记中包含xmlns的XML文件
  7. MDK、keil复制中文注释乱码
  8. 枪林弹雨显示服务器正在维修,枪林弹雨Patcher 已停止工作解决方法教程
  9. 苹果手机投屏器 及如何使用设置连接电脑投屏教程
  10. COMSOL吸附模拟
  11. luogu P4173 残缺的字符串
  12. 计算机方面的缩写大全
  13. Python不是内部或外部命令的(完美解决)
  14. Java多维数组length
  15. CAD转PDF其实很简单,掌握这4种方法就可以
  16. 儿科微信端产品推广策划方案记录
  17. 关于system(pause)
  18. 猜数游戏 先由计算机,C++实现猜数游戏
  19. 解决macos13卡死转圈
  20. QQ通讯录系统——用C++模拟实现,学C++必玩项目】

热门文章

  1. Python脚本图解
  2. 线性代数:第三章 矩阵的初等变换与线性方程组(2)线性方程组的解 初等方阵
  3. 随机重命名MP3文件
  4. Shell教程(三):数组/Arrays、基本运算符
  5. Day 19: EmberJS 入门指南
  6. Ubuntu14.04安装Octave
  7. 鸟哥的Linux私房菜(基础篇)- 第十五章、磁碟配额(Quota)与进阶文件系统管理
  8. Emacs自带的小游戏
  9. 设计师学习HTML/CSS之路-13
  10. 提供openssl -aes-256-cbc兼容加密/解密的简单python函数