git submodules

来源:互联网 发布:javascript闭包是什么 编辑:程序博客网 时间:2024/05/23 13:47

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

下面准备两个项目和两个公共类库,project1,project2, lib1, lib2
初始化略过~
为主项目添加submodules

> cd project1/> git submodule add ../lib1.git libs/lib1> git submodule add ../lib2.git libs/lib2> lslibs, project-info.html  //当前项目(project1)中的文件> git statusnew file: .gitmodulesnew file: libs/lib1new file: libs/lib2

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

修改submodule

> cd lib1> git statusNot currently on any branchnothing 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 masterSwitched 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 结束

0 0