git 操作以及submodule模式详解,附加jenkins对submodule方式的集成

git常用命令

注意:请确保已经安装里git客户端

git使用帮助

git --help    //git使用帮助,可以查看git使用指令

一般配置

git --version      //查看git的版本信息

git config --global user.name 'username'       //配置当前登录的用户

git config --global user.email 'email'   //配置当前登录用户的邮箱

git初始化

git init

查看目录

ls  或者 ls -al

查看文件

cat filename

增加到暂存区、取消增加

git add filename    //添加单个文件

git add . 或者git add -a     //添加所有未被忽略的文件

git reset HEAD index.html      //取消

增加到版本库中

git commit -m "提交备注信息"

查看历史提交

git log

比较差异

git diff   //比较的是暂存区和工作区的差异

git diff --cached     //比较的是暂存区和历史区的差异

git diff master    //比较的是历史区和工作区的差异(修改)

删除

rm fileName     //删除文件

git rm index.html --cached    //删除暂存区

回滚

git reset --hard HEAD/commit_id

分支管理

git branch dev    //创建分支

git check dev     //切换分支

git checkout -b dev    //创建分支并切换分支

git branch -d dev    //删除分支

git commit -a -m 'dev1' //分支上提交

git merge dev  //合并分支

git stash    //保留改动

git stash drop    //废弃保留的内容

git stash pop     //使用保留的内容

git rebase    //合并分支

添加到远程仓库

git push -u origin master     //获取最新代码

git remote add origin 仓库的地址    //连接远程仓库

git remote -v    //查看远程仓库

git remote rm origin    //删除远程仓库

更新代码,合并冲突

git pull     //更新代码

解决冲突(具体遇到时再贴图完善)

根据更新代码时的冲突日志,找到冲突文件,合并代码,重新提交

以上为基础的使用方式,以后有时间再完善。


git submodule 管理项目子模块

使用场景:

当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到git的submodule功能。

什么是Submodule?

git Submodule是一个很好的多项目使用共同类库的工具,他允许类库项目做为repository,子项目做为一个单独的git项目存在父项目中,子项目可以有自己的独立的commit,push,pull。而父项目以Submodule的形式包含子项目,父项目可以指定子项目header,父项目中会的提交信息包含Submodule的信息,再clone父项目的时候可以把Submodule初始化。

常用指令:

git clone git地址 --recursive 递归的方式克隆整个项目

git submodule add 添加子模块

git submodule init 初始化子模块

git submodule update 更新子模块

git submodule foreach git pull 拉取所有子模块

使用:

1. 创建带子模块的版本库

例如我们要创建如下结构的项目

project  

|--moduleA

|--readme.txt

创建project版本库,并提交readme.txt文件

git init --bare project.git

git clone project.git project1

cd project1

echo"This is a project."> readme.txt

git add .

git commit -m "add readme.txt"

git push origin master

cd..

创建moduleA版本库,并提交a.txt文件

git init --bare moduleA.git

git clone moduleA.git moduleA1

cd moduleA1

echo"This is a submodule."> a.txt

git add .

git commit -m"add a.txt"

git push origin master

cd..

在project项目中引入子模块moduleA,并提交子模块信息

cd project1

git submodule add ../moduleA.git moduleA

git status

git diff

git add .

gitcommit-m"add submodule"

git push originmastercd ..

使用git status可以看到多了两个需要提交的文件,其中.gitmodules指定submodule的主要信息,包括子模块的路径和地址信息,moduleA指定了子模块的commit id,使用git diff可以看到这两项的内容。这里需要指出父项目的git并不会记录submodule的文件变动,它是按照commit id指定submodule的git header,所以.gitmodules和moduleA这两项是需要提交到父项目的远程仓库的。

Onbranch masterYour branchisup-to-datewith'origin/master'.Changestobe committed:  (use"git reset HEAD ..."tounstage)newfile:  .gitmodulesnewfile:  moduleA

2. 克隆带子模块的版本库

方法一,先clone父项目,再初始化submodule,最后更新submodule,初始化只需要做一次,之后每次只需要直接update就可以了,需要注意submodule默认是不在任何分支上的,它指向父项目存储的submodule commit id。

git clone project.git project2

cd project2

git submodule init

git submodule update

cd..

方法二,采用递归参数--recursive,需要注意同样submodule默认是不在任何分支上的,它指向父项目存储的submodule commit id。

git clone project.git project3 --recursive

3. 修改子模块

修改子模块之后只对子模块的版本库产生影响,对父项目的版本库不会产生任何影响,如果父项目需要用到最新的子模块代码,我们需要更新父项目中submodule commit id,默认的我们使用git status就可以看到父项目中submodule commit id已经改变了,我们只需要再次提交就可以了。

先提交子模块

cd project1/moduleA

git add .git commit -m"add b.txt"

git push origin master

再提交project

cd..

git status

git diff

git add .

git commit -m"update submodule add b.txt"

git push origin mastercd..

4. 更新子模块

更新子模块的时候要注意子模块的分支默认不是master。

方法一,先pull父项目,然后执行git submodule update,注意moduleA的分支始终不是master。

cd project2

git pull

git submodule update

cd..

方法二,先进入子模块,然后切换到需要的分支,这里是master分支,然后对子模块pull,这种方法会改变子模块的分支。

cd project3/moduleA

git checkout master

cd..

git submodule foreach git pull

cd..

5. 删除子模块

网上有好多用的是下面这种方法

git rm--cached moduleA

rm -rf moduleA

rm .gitmodules

vim .git/config

删除submodule相关的内容,例如下面的内容

[submodule"moduleA"]      url =/Users/nick/dev/nick-doc/testGitSubmodule/moduleA.git

然后提交到远程服务器

git add .

gitcommit-m"remove submodule"

但是我自己本地实验的时候,发现用下面的方式也可以,服务器记录的是.gitmodules和moduleA,本地只要用git的删除命令删除moduleA,再用git status查看状态就会发现.gitmodules和moduleA这两项都已经改变了,至于.git/config,仍会记录submodule信息,但是本地使用也没发现有什么影响,如果重新从服务器克隆则.git/config中不会有submodule信息。

git rm moduleA

git status

gitcommit-m"remove submodule"

git push origin master



Jenkins应用git submodule

Jenkins用来做项目的持续集成,如果使用了Git Submodule,每次Jenkins更新版本库的时候还需要更新submodule的内容。

1、确保你已经下载并能使用Jenkins,如果没有,自己去下载Jenkins

2、具体配置

新建自由风格项目,设置项目更新submodule


 Add Credentials(访问git用到的用户配置,不然会连接不上git仓库)



其他构建配置:

具体构建问题可以通过构建日志去查看,排查,解决,这里就不做详细说明了。


可以在jenkins的工作空间中查看git submodule 代码是否拉取成功


最后构建


总的步骤已经说明完了。good luck~~~~~~~~~~~~


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • rebase 多人在同一个分支上协作时,很容易出现冲突。即使没有冲突,后push的童鞋不得不先pull,在本地合并...
    七夏呀阅读 138评论 0 0
  • 获取与创建项目 创建仓库的途径有:在本地已有的目录,初始化一个新的;克隆复制一份别人的项目。 git init 在...
    daking阅读 6,514评论 3 48
  • git教程 git简介 git是一个开源的分布式版本控制系统,用于敏捷高效的处理任何大小的项目。 git工作流程相...
    阿狸404阅读 275评论 0 0
  • 配置 首先是配置帐号信息ssh -T git@github.com # 登陆 github 修改项目中的个人信息 ...
    guanguans阅读 703评论 0 3
  • Add & Commit git init 初始化一个 Git 仓库(repository),即把当前所在目录变成...
    冬絮阅读 4,749评论 0 8