ThoughtWorks创新实验室2017届西安思沃大讲堂Git简单应用

Git - 子模块

2016-12-06  本文已影响155人  rangel

做为一名程序员,大家对 ** Git ** 肯定都不陌生,最近项目中用到了 Git 子模块,今天,给大家讲一下 ** Git ** 子模块。

通常,一个大型工程总会被分拆为一些子工程。这既有利于工程开发难度的降低,也有利于使用现成的方案或者第三方方案作为子工程。git submodule 就是完成这样一种子工程拆分与整合的工具。下面开始简单介绍一下 git submodule 的用法。

什么是 Submodule?

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

在项目中使用Submodule

git submodule add git@github.com:jjz/pod-library.git pod-library
git status
On branch master
 Changes to be committed:
       new file: .gitmodules 
       new file: pod-library

可以看到多了两个需要提交的文件:.gitmodules 和 pod-library
**.gitmodules ** 内容包含 Submodule 的主要信息,指定 reposirory 的路径

[submodule "pod-library"] 
path = pod-library 
url = git@github.com:jjz/pod-library.git

可以看到记录了子项目的目录和子项目的 git 地址信息。

git add .gitmodules pod-ibrary
git commit -m "pod-library submodule"
git submodule init
cd pod-library/
git status
modified: pod-library/UseAFHTTP.h
git commit -a -m'test submodule'
git push
cd ..
git status
modified: pod-library (new commits)

可以看到 pod-library 中已经变更为 Submodule 最新的 commit id

Subproject commit 330417cf3fc1d2c42092b20506b0d296d90d0b5f
git commit -m'update submodule'
git push

这样就把子模块的变更信息以及子模块的变更信息提交到远程服务器了,从远程服务器上更新下来的内容就是最新提交的内容了。

  1. 在父项目的目录下直接运行
git submodule foreach git pull
  1. 在Submodule的目录下面更新
cd pod-library
git pull
  1. 采用递归参数 --recursive
git clone git@github.com:jjz/pod-project.git --recursive

执行结果

loning into 'pod-project'...
remote: Counting objects: 57, done.
remote: Compressing objects: 100 % (45 / 45), done.
remote: Total 57(delta 13), reused 49(delta 8), pack - reused 0
Receiving objects: 100 % (57 / 57), 18.79 KiB | 0 bytes / s, done.
Resolving deltas: 100 % (13 / 13), done.
Checking connectivity...done.
Submodule 'pod-library' (git @github.com: jjz / pod - library.git) registered
for path 'pod-library'
Cloning into 'pod-library'...
remote: Counting objects: 34, done.
remote: Compressing objects: 100 % (25 / 25), done.
remote: Total 34(delta 8), reused 30(delta 7), pack - reused 0
Receiving objects: 100 % (34 / 34), 12.95 KiB | 0 bytes / s, done.
Resolving deltas: 100 % (8 / 8), done.
Checking connectivity...done.
Submodule path 'pod-library': checked out '330417cf3fc1d2c
42092 b20506b0d296d90d0b5f '

可以看到 init Submodule 会自动被 clone 下来

  1. 先 clone 父项目,再初始化 Submodule
    执行
git clone git@github.com:jjz/pod-project.gitcd pod-project
git submodule init

会看到

Submodule 'pod-library' (git@github.com:jjz/pod-library.git) 
registered for path 'pod-library'

然后更新 Submodule

git submodule update

看到输出结果为

  Cloning into 'pod-library'...
  remote: Counting objects: 34, done.
  remote: Compressing objects: 100 % (25 / 25), done.
  remote: Total 34(delta 8), reused 30(delta 7), pack - reused 0
  Receiving objects: 100 % (34 / 34), 12.95 KiB | 0 bytes / s, done.
  Resolving deltas: 100 % (8 / 8), done.
  Checking connectivity...done.
  Submodule path 'pod-library': checked out '330417cf3fc1d2c42092b20506b0d296d90d0b5f'

所以,用两种方法都能初始化 Submodule

cd pod-project
git rm --cached pod-library
rm -rf pod-library
rm .gitmodules

更改 git 的配置文件 config

vim .git/config

可以看到 Submodule 的配置信息:

[submodule "pod-library"] 
    url = git@github.com:jjz/pod-library.git

删除submodule相关的内容,然后提交到远程服务器

git commit -a -m 'remove pod-library submodule'

Submodule 有在项目开发的过程中有很大的用处,希望文章对大家有帮助。

上一篇下一篇

猜你喜欢

热点阅读