使用git支撑构建过程之代码同步

环境说明:

中心代码库在192.168.120.200的gitlab上,以刚刚克隆下来的tttt库为例
开发机器kunlunsec,用来修改tttt库的代码
编译服务器bmcCompileBak,其中的目录/home/kunlun/rxsunSource/gitSource是用来存放源代码库的,目录/home/kunlun/rxsunSource/openbmc/build/downloads/git2是为构建工具准备的裸库存放的位置.

试验目标:

1.开发机器kunlunsec上的改动能通过192.168.120.200服务器同步到编译服务器bmcCompileBak上的源代码库里
2.编译服务器bmcCompileBak上同步后的源代码库能推送(git push)到编译服务器bmcCompileBak本地的构建目录下/home/kunlun/rxsunSource/openbmc/build/downloads/git2

基本思路:

在编译服务器bmcCompileBak的源代码库/home/kunlun/rxsunSource/gitSource/tttt中设置两个remote仓库,一个是中心代码库192.168.120.200上的tttt.git裸库,命名为origin,另一个是/home/kunlun/rxsunSource/openbmc/build/downloads/git2里的tttt.git裸库,命名为local.然后从origin拉取(git pull)代码变更,推送(git push)到local上.

步骤一:在编译服务器bmcCompileBak上克隆源代码库和裸库到各自的目的地

克隆下来试验用的源代码库,在home/kunlun/rxsunSource/gitSource下
cd /home/kunlun/rxsunSource/gitSource
git clone git@192.168.120.200:qa/tttt.git

到存放所有的裸库的文件夹,克隆裸库下来.
cd /home/kunlun/rxsunSource/openbmc/build/downloads/git2/
git clone –bare git@192.168.120.200:qa/tttt.git
这里的库是为构建所用的.

步骤二:在编译服务器bmcCompileBak上为源代码库添加第二个远程库,就是刚刚克隆下来的裸库

进入目录 cd /home/kunlun/rxsunSource/gitSource/tttt/
git remote add local /home/kunlun/rxsunSource/openbmc/build/downloads/git2/tttt.git
查看一下,第一种是命令行查看,第二种是查看config文件,看到增加了一个名为”local”的远程库

kunlun@bmcCompileBak:~/rxsunSource/gitSource/tttt$ git remote
local
origin    
kunlun@bmcCompileBak:~/rxsunSource/gitSource/tttt$ cat .git/config 
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@192.168.120.200:qa/tttt.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[remote "local"]
    url = /home/kunlun/rxsunSource/openbmc/build/downloads/git2/tttt.git
    fetch = +refs/heads/*:refs/remotes/local/*

步骤三:在开发机kunlunsec上模拟开发过程中两个分支的代码提交

换到开发机kunlunsec上tttt进行操作并提交

kunlun@kunlunsec:~/tmp$ git clone git@192.168.120.200:qa/tttt.git
正克隆到 'tttt'...  
接收对象中: 100% (20/20), 完成.
检查连接... 完成。
kunlun@kunlunsec:~/tmp$ cd tttt/
kunlun@kunlunsec:~/tmp/tttt$ ll
-rw-rw-r-- 1 kunlun kunlun   21 8月  17 18:55 a.txt

查看当前分支

kunlun@kunlunsec:~/tmp/tttt$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/test
为master分支添加文件b.txt,并commit,push
kunlun@kunlunsec:~/tmp/tttt$ touch b.txt
kunlun@kunlunsec:~/tmp/tttt$ echo "test next remote repo">b.txt
kunlun@kunlunsec:~/tmp/tttt$ cat b.txt 
test next remote repo
kunlun@kunlunsec:~/tmp/tttt$ git add .
kunlun@kunlunsec:~/tmp/tttt$ git commit -m "next remote test"
[master 310edf3] next remote test
 1 file changed, 1 insertion(+)
 create mode 100644 b.txt
kunlun@kunlunsec:~/tmp/tttt$ git push

切换到tttt库的另一个分支test,模拟实际开发中的另一个厂商代码:

kunlun@kunlunsec:~/tmp/tttt$ git checkout test
分支 test 设置为跟踪来自 origin 的远程分支 test。
切换到一个新分支 'test'
kunlun@kunlunsec:~/tmp/tttt$ git branch -a
  master
* test
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/test
kunlun@kunlunsec:~/tmp/tttt$ ll
总用量 16
drwxrwxr-x 4 kunlun kunlun 4096 8月  17 19:03 ./
drwxrwxr-x 3 kunlun kunlun 4096 8月  17 18:55 ../
-rw-rw-r-- 1 kunlun kunlun    0 8月  17 19:03 ddd.txt

看到test分支下的文件与master分支的文件是不同的.
为test分支添加文件eee.txt,并commit,push

kunlun@kunlunsec:~/tmp/tttt$ echo "another file to test branch">eee.txt
kunlun@kunlunsec:~/tmp/tttt$ cat eee.txt 
another file to test branch
kunlun@kunlunsec:~/tmp/tttt$ git add .
kunlun@kunlunsec:~/tmp/tttt$ git commit -m "another file to test branch"
[test d983cbf] another file to test branch
 1 file changed, 1 insertion(+)
 create mode 100644 eee.txt
kunlun@kunlunsec:~/tmp/tttt$ git push

以上操作是在tttt库的master分支上增加了文件b.txt,在test分支上增加了文件eee.txt,并推送到192.168.120.200中心代码服务器上.

步骤四:在bmcCompileBak编译服务器上依次拉取master分支和test分支的代码

回到bmcCompileBak编译服务器上

kunlun@bmcCompileBak:~/rxsunSource/gitSource/tttt$ git branch -a //查看当前分支
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/test

kunlun@bmcCompileBak:~/rxsunSource/gitSource/tttt$ git pull origin master //与名为origin的远程库,即192.168.120.200中心代码服务器同步master分支的代码
From 192.168.120.200:qa/tttt
 * branch            master     -> FETCH_HEAD
Updating fce3d3b..310edf3
Fast-forward
 b.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 b.txt

kunlun@bmcCompileBak:~/rxsunSource/gitSource/tttt$ ll   //看到新增加的b.txt文件被同步下来
total 24
drwxrwxr-x 4 kunlun kunlun 4096 8月  17 19:24 ./
drwxrwxr-x 8 kunlun kunlun 4096 8月  17 18:32 ../
-rw-rw-r-- 1 kunlun kunlun   21 8月  17 18:29 a.txt
-rw-rw-r-- 1 kunlun kunlun   22 8月  17 19:24 b.txt

再同步test分支的代码

kunlun@bmcCompileBak:~/rxsunSource/gitSource/tttt$ git pull origin test  //这时git给出一个merge操作,确定
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From 192.168.120.200:qa/tttt
 * branch            test       -> FETCH_HEAD
   2f18328..d983cbf  test       -> origin/test
Merge made by the 'recursive' strategy.
 ddd.txt | 0
 eee.txt | 1 +
 2 files changed, 1 insertion(+)
 create mode 100644 ddd.txt
 create mode 100644 eee.txt

查看log,发现本地库里包括了在开发机器上两个分支上的提交,并记录了刚刚的合并动作

kunlun@bmcCompileBak:~/rxsunSource/gitSource/tttt$ git log  
commit 9d816d31f5244890927ab1c3b5a846a5bcb651ca
Merge: 310edf3 d983cbf
Author: rxsun <rxsun@bios.zd-tech.com.cn>
Date:   Sat Aug 17 19:24:52 2019 +0800
    Merge branch 'test' of 192.168.120.200:qa/tttt
commit d983cbf670c31d58cde88da7371f71a6bad7f846
Author: rxsun <“rxsun@zd-tech.com.cn>
Date:   Sat Aug 17 19:21:44 2019 +0800
    another file to test branch
commit 310edf371ad05051308aa49601d709064403909e
Author: rxsun <“rxsun@zd-tech.com.cn>
Date:   Sat Aug 17 18:56:55 2019 +0800
    next remote test

查看工作区状态,当前工作区是干净的

kunlun@bmcCompileBak:~/rxsunSource/gitSource/tttt$ git status  
On branch master
Your branch is ahead of 'origin/master' by 3 commits.
  (use "git push" to publish your local commits)
nothing to commit, working directory clean

确认当前所在的分支,还是master

kunlun@bmcCompileBak:~/rxsunSource/gitSource/tttt$ git branch -a  
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/test

查看本地文件,包括了master分支的a.txt,b.txt, 以及test分支的ddd.txt和eee.txt.

kunlun@bmcCompileBak:~/rxsunSource/gitSource/tttt$ ll
drwxrwxr-x 4 kunlun kunlun 4096 8月  17 19:24 ./
drwxrwxr-x 8 kunlun kunlun 4096 8月  17 18:32 ../
-rw-rw-r-- 1 kunlun kunlun   21 8月  17 18:29 a.txt
-rw-rw-r-- 1 kunlun kunlun   22 8月  17 19:24 b.txt
-rw-rw-r-- 1 kunlun kunlun    0 8月  17 19:24 ddd.txt
-rw-rw-r-- 1 kunlun kunlun   28 8月  17 19:24 eee.txt

可见,在master分支上, git pull origin master和 git pull origin test 都执行的话,会将test分支的内容也拉取到master分支里面 ,这明显不符合要求.

回退到拉取代码之前的commit号

kunlun@bmcCompileBak:~/rxsunSource/gitSource/tttt$ git reset --hard fbf549d38c71d56171a2cb23cfc4a5218953e943  这是本次操作之前的一个commit号

查看当前内容

kunlun@bmcCompileBak:~/rxsunSource/gitSource/tttt$ ll  
-rw-rw-r-- 1 kunlun kunlun   16 8月  17 19:58 a.txt

就回到了本次拉取操作之前的状态

步骤五:在bmcCompileBak编译服务器上只拉取master分支

只同步master分支,查看结果,这个结果是符合预期的

kunlun@bmcCompileBak:~/rxsunSource/gitSource/tttt$ git pull origin master  
kunlun@bmcCompileBak:~/rxsunSource/gitSource/tttt$ ll
-rw-rw-r-- 1 kunlun kunlun   21 8月  17 20:00 a.txt
-rw-rw-r-- 1 kunlun kunlun   22 8月  17 20:00 b.txt

步骤六:在bmcCompileBak编译服务器上将master分支推送到local的远程仓库里master分支上

执行push,推送的目的地是本地的名为local的远程仓库里master分支上,就是步骤一中克隆下来的裸库/home/kunlun/rxsunSource/openbmc/build/downloads/git2/tttt.git

kunlun@bmcCompileBak:~/rxsunSource/gitSource/tttt$ git push local master
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 336 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /home/kunlun/rxsunSource/openbmc/build/downloads/git2/tttt.git
   fce3d3b..310edf3  master -> master

进入裸库看一下branch和log,已经同步成功

kunlun@bmcCompileBak:~/rxsunSource/gitSource/tttt$ cd /home/kunlun/rxsunSource/openbmc/build/downloads/git2/tttt.git
kunlun@bmcCompileBak:~/rxsunSource/openbmc/build/downloads/git2/tttt.git$ git branch -a
* master
  test
kunlun@bmcCompileBak:~/rxsunSource/openbmc/build/downloads/git2/tttt.git$ git log
commit 310edf371ad05051308aa49601d709064403909e
Author: rxsun <“rxsun@zd-tech.com.cn>
Date:   Sat Aug 17 18:56:55 2019 +0800
    next remote test

步骤七:在bmcCompileBak编译服务器上同步origin的远程仓库里test分支变化源代码库里

再回到tttt的源代码库里,切换到tset分支.

kunlun@bmcCompileBak:cd ~/rxsunSource/gitSource/tttt
kunlun@bmcCompileBak:~/rxsunSource/gitSource/tttt$ git checkout test
Branch test set up to track remote branch test from origin.
Switched to a new branch 'test'
kunlun@bmcCompileBak:~/rxsunSource/gitSource/tttt$ ll
-rw-rw-r-- 1 kunlun kunlun    0 8月  17 20:06 ddd.txt
-rw-rw-r-- 1 kunlun kunlun   28 8月  17 20:06 eee.txt

发现这种checkout操作会自动拉下远程origin仓库test分支的所有内容.

复习一下,origin和local远程库的地址,origin是中心代码库,在192.168.120.200上,local在bmcCompileBak编译服务器上,是供构建使用的

[remote "origin"]
    url = git@192.168.120.200:qa/tttt.git
[remote "local"]
    url = /home/kunlun/rxsunSource/openbmc/build/downloads/git2/tttt.git

步骤八:在bmcCompileBak编译服务器上同步test分支的变化到local的远程仓库里test分支上

将源代码库里test分支的内容push到本地的名为local的远程仓库里test分支上

kunlun@bmcCompileBak:~/rxsunSource/gitSource/tttt$  git push local test
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 355 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /home/kunlun/rxsunSource/openbmc/build/downloads/git2/tttt.git
   2f18328..d983cbf  test -> test

查看当前分支

kunlun@bmcCompileBak:~/rxsunSource/gitSource/tttt$ cd /home/kunlun/rxsunSource/openbmc/build/downloads/git2/tttt.git
kunlun@bmcCompileBak:~/rxsunSource/openbmc/build/downloads/git2/tttt.git$ git branch -a
* master
  test

试图在裸库里切换到test分支,发现不能操作,这种方法没法验证test分支是否被推送上来了.

kunlun@bmcCompileBak:~/rxsunSource/openbmc/build/downloads/git2/tttt.git$ git checkout test  
fatal: This operation must be run in a work tree

步骤九:在bmcCompileBak编译服务器上验证test分支的变化被推送到了local远程仓库

在bmcCompileBak编译服务器上,到另一个目录再clone一份test分支的内容,从/home/kunlun/rxsunSource/openbmc/build/downloads/git2/tttt.git ,看看结果

kunlun@bmcCompileBak:~/rxsunSource$ mkdir tmp
kunlun@bmcCompileBak:~/rxsunSource$ cd tmp
kunlun@bmcCompileBak:~/rxsunSource/tmp$ git clone /home/kunlun/rxsunSource/openbmc/build/downloads/git2/tttt.git
Cloning into 'tttt'...
done.
kunlun@bmcCompileBak:~/rxsunSource/tmp$ cd tttt/
kunlun@bmcCompileBak:~/rxsunSource/tmp/tttt$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/test
kunlun@bmcCompileBak:~/rxsunSource/tmp/tttt$ git checkout test
Branch test set up to track remote branch test from origin.
Switched to a new branch 'test'
kunlun@bmcCompileBak:~/rxsunSource/tmp/tttt$ ll
-rw-rw-r-- 1 kunlun kunlun    0 8月  17 20:14 ddd.txt
-rw-rw-r-- 1 kunlun kunlun   28 8月  17 20:14 eee.txt

结果是符合预期的,证明test分支到local远程库的推送是成功的.

总结:

编译服务器bmcCompileBak上的源代码库可以设置两个远程仓库,一个对应着中心代码库,从这里拉取下来代码,另一个对应着本地的构建代码库,推送代码到这个库.并且,可以实现不同分支的拉取和推送.
这种机制是能够为构建服务的.

=====================================================================================================

ruixia,sun wechat
生活相关,请扫描wechat帐号获取更多精彩内容。。。。。。
0%