您的位置:首页 > 其它

git submodules

2016-02-19 20:27 302 查看
git权威指南: 项目的版本库在某些情况下需要引用其他版本库中的文件,例如公司积累了一套常用的函数库,被多个项目调用,显然这个函数库的代码不能直接放到某个项目的代码当中,而是要独立为一个代码库。那么其他项目要调用公共函数库该如何处理,分别拷贝会造成冗余,显然不是一个好的方法

下面准备两个项目和两个公共类库,project1,project2, lib1, lib2

初始化略过~

为主项目添加submodules

> cd project1/
> git submodule add ../lib1.git libs/lib1
> git submodule add ../lib2.git libs/lib2
> ls
libs, project-info.html  //当前项目(project1)中的文件
> git status
new file: .gitmodules
new file: libs/lib1
new file: libs/lib2


当我们为project1添加公共类库的时候,会发现多出一个.gitmodules文件,查看其内容可知,.gitmodules记录了submodules中的每一个引用信息,了解当前项目的位置以及仓库的所在

修改submodule

> cd lib1
> git status
Not currently on any branch
nothing to commit(working directory clean)


可以看出当前的submodule并不在任何的分支上

因为

git对于submodule有特殊的处理方式,在一个主项目中引入了submodule其实git做了三件事情

记录引用的仓库

记录主项目中的Submodules的目录位置

记录引用Submodule的commit id

在project1中push之后其实就是更新了引用的commit-id 然后在project1 在clone的时候获取到了submodule的commit-id 然后当执行git submodule update 的时候git 根据 gitlink 获取submodule的commit-id 最后获取submodule的文件,所以clone之后的并不在任何的分支上。

这时候我们修改lib1的文件需要先切换到master分支

/lib1 > git checkout master
Switched to branch 'masterl'
> echo 'add by developer B' >> lib1-features
> git commit -a -m 'update lib1-features by developer B'


这时候回到project1, 查看status状态会发现在lib1中有一个new commits,用git diff观察会发现commit-id改变

注意:如果现在执行了git submodule update操作那么libs/lib1的commit id又会还原到上一个数值,这样的话刚刚的修改是不是就丢失了呢?不会,因为修改已经提交到了master分支,只要再git checkout master就可以了。

之后提交lib1 git push,这只是完成了第一步

下一步要提交project1 然后push到远程分支

ok 结束


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: