git submodule:就是多个项目公共部分抽离出来,进行统一管理,只需把公共资源加入到git项目中去即可;、
例如:
准备环境
1、
1.1、mkdir -p submd/repos
1.2、创建本地仓库
1.2.1、git --git-dir=lib1.git init --bare
git --git-dir=lib1.git init --bare
git --git-dir=project1.git init --bare
git --git-dir=project1.git init --bare
1.2.2、初始化工作区
mkdir -p subd/ws
1.2.3、初始化项目
git clone ../repos/projec1.git
echo "project1" > project-infos.txt(工作区)
git add * (把工作区的文件添加索引)
git commit -a -m "add file"(把工作区移到暂存区)
git push origin master(把暂存区提交到远程服务器)
git clone ../repos/projec2.git
echo "project2" > project-infos.txt(工作区)
git add * (把工作区的文件添加索引)
git commit -a -m "add file"(把工作区移到暂存区)
git push origin master(把暂存区提交到远程服务器)
1.2.4项目的公共类库
git clone ../repos/lib1.git
echo "lib1" > project-infos.txt(工作区)
git add * (把工作区的文件添加索引)
git commit -a -m "add file"(把工作区移到暂存区)
git push origin master(把暂存区提交到远程服务器)
git clone ../repos/lib2.git
echo "lib2" > project-infos.txt(工作区)
git add * (把工作区的文件添加索引)
git commit -a -m "add file"(把工作区移到暂存区)
git push origin master(把暂存区提交到远程服务器)
1.2.5、为主项目添加公共类库
cd projec1
git submodule add ../submd/repos/lib1.git libs/lib1
git submodule add ../submd/repos/lib2.git libs/lib2
git status
git commit -a -m "add submodules[lib1/lib2] to project1"
git push
1.2.6、其他人员怎么引入带有子模块的项目呢
cd ../ws
git clone ../repos/project1.git project1-b
git status
git submodules:会有hash码和文件目录,前面的-:含义是子模块没有检出;
子模块内容为空,此时可以检出子模块 git submodule init && git submodule update(更新commit id号)
1.2.7、修改子模块中的文件信息
cd libs/lib1
git status
提示没有分支信息,原因:git对于submodule有特殊处理1,git记录引用的仓库。2,记录主项目中submodule的目录位置。3,记录引用submodule的commint id
在project1中git push之后其实就更新了commint id,然后project-b在clone的时候获取到了commint id,然后当执行git submodule update的时候git就根据git link 获取 submodule的commint id,最后获取submodule文件,所以clone之后不存在任何分支上;但是master的commint id和HEAD保持一致
cat .git/HEAD
cat .git/refs/heads/master
修改lib1上面的文件需要切换到master上面 git checkout master
echo "aaa" > project-infos.txt
git commint -a -m "chanage file"
submodule中文件修改提交ok了。但是回到主项目上面project也要提交了update等操作
回到主项目cd ../project1-b
git status
git diff 发现commint id发生了变化(注意如果此时执行git commint update 那么libs/lib1的commint id 又回到原来的commint id,此次submodule修改就没了?不会在切换到master即可)
回到 libs/lib1中把修改的push上去这样submodule 就有了新的commint id
回到主项目中project1-b
git add -u
git commint -a -m "update libs/lib commint id"
git push
此时已经把修改的子项目主项目都提交到了远程服务器上面。其他人的主项目需要更新下来(是带有submodule的主项目更新)
cd ,,.project1
git pull
git status
git dif(comint id 不一样了,因为上一个人已经修改了libs/lib子项目得commint id),所在在project1中要更新一下子项目得mommint id
git submodule init (把子模块注册到.git/config中去)&& git submodule update
git status