您的位置:首页 > 其它

Git Submodule完整教程(3/3)

2014-06-22 22:04 531 查看


2.8.1 牛刀小试

?
我们通过分析.gitmodules文件得出子模块的路径,然后就可以根据这些路径进行更新。


2.8.2 上路

?
把下面的脚本复制到bin/update-submodules.sh中:

?
稍微解释一下上面的脚本执行过程:

首先把子模块的路径写入到文件/tmp/study-git-submodule-dirs中;

然后读取文件中的子模块路径,依次切换到master分支(修改都是在master分支上进行的),最后更新最近改动。


2.8.3 2013-01-19更新

网友@紫煌给出了更好的办法,一个命令就可以代替上面的bin/update-submodules.sh的功能:

?
此命令也脚本一样,循环进入(enter)每个子模块的目录,然后执行foreach后面的命令。

该后面的命令可以任意的,例如 git submodule foreach ls -l 可以列出每个子模块的文件列表


2.8.3 体验工具带来的便利

?
更新之后的两个变化:

git submodule的结果和project2的submodule commit id保持一致;

project1-b不再提示new commits了。

现在可以把工具添加到仓库了,当然你可以很骄傲的分享给其他项目组的同事。

?


2.9 新进员工加入团队,一次性Clone项目和Submodules

一般人使用的时候都是使用如下命令:

?
新员工不耐烦了,嘴上不说但是心里想:怎么那么麻烦?


上面的命令简直弱暴了,直接一行命令搞定:

?
recursive参数的含义:可以在clone项目时同时clone关联的submodules。

git help 对其解释:
--recursive, --recurse-submodules
After the clone is created, initialize all submodules within, using their default settings. This is equivalent to running git
submodule update --init --recursive immediately after the clone is finished. This option is ignored if the cloned repository
does not have a worktree/checkout (i.e. if any of --no-checkout/-n, --bare, or --mirror is given)


2.9.1 使用一键方式克隆project2

?
舒服……

3.移除Submodule

牢骚:搞不明白为什么git不设计一个类似:git submodule remove的命令呢?

我们从project1.git克隆一个项目用来练习移除submodule:

?


3.1 Step by

1、删除git cache和物理文件夹

?
2、删除.gitmodules的内容(或者整个文件) 因为本例只有两个子模块,直接删除文件:

?
如果仅仅删除某一个submodule那么打开.gitmodules文件编辑,删除对应submodule配置即可。


3、删除.git/config的submodule配置 源文件:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = /home/henryyan/submd/ws/../repos/project1.git
[branch "master"]
remote = origin
merge = refs/heads/master
[submodule "libs/lib1"]
url = /home/henryyan/submd/repos/lib1.git
[submodule "libs/lib2"]
url = /home/henryyan/submd/repos/lib2.git


删除后:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = /home/henryyan/submd/ws/../repos/project1.git
[branch "master"]
remote = origin
merge = refs/heads/master


4、提交更改

?

4.结束语

对于Git Submodule来说在刚刚接触的时候多少会有点凌乱的赶紧,尤其是没有接触过svn:externals

本文从开始创建项目到使用git submodule的每个步骤以及细节、原理逐一讲解,希望到此读者能驾驭它。

学会了Git submdoule你的项目中再也不会出现大量重复的资源文件、公共类库,更不会出现多个版本,甚至一个客户的多个项目风格存在各种差异。

本文的写作来源于工作中的实践,如果您对于某个做法有更好的办法还请赐教,希望能留下您宝贵的意见。

原创文章,转载请注明出处! Git Submoudle使用完整教程--咖啡兔
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: