版本控制 Git RPM打包
版本控制
版本庫
典型的客戶/服務器系統
- 版本庫是版本控制中心的核心
- 任意數量客戶端
- 客戶端通過寫數據庫分享代碼
版本控制系統
集中式版本控制系統
- 開發者之間共用一個倉庫(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軟件。
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 對象
!!!做git有關的任何操作一定要先cd進git的工作區
2) 本地工作區對數據進行增刪改查(必須要先進入倉庫再操作數據)。
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就可以將服務器上新的數據更新到本地。
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 -> master2 ) 查看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支持按功能模塊、時間、版本等標準創建分支,分支可以讓開發分多條主線同時進行,每條主線互不影響,分支效果如圖所示
常見的分支規范如下:
- 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:7892)創建分支。
[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:7892)在新的分支上可以繼續進行數據操作(增、刪、改、查)。
[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 thrid3)將hotfix修改的數據合并到master分支。
注意,合并前必須要先切換到master分支,然后再執行merge命令。
- 步驟二:解決版本分支的沖突問題
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_ssh3)客戶端生成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-daemon2)創建版本庫(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 gitweb2)修改配置文件,設置倉庫根目錄(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 httpd4)客戶端訪問方式(web2主機操作)
注意:調用虛擬機中的firefox瀏覽器,需要在遠程時使用ssh -X 服務器IP,并且確保真實主機的firefox已經關閉。
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-build2)生成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包
- 步驟三:安裝軟件
總結
以上是生活随笔為你收集整理的版本控制 Git RPM打包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tomcat服务器 V
- 下一篇: 集群与存储 LVS的集群