有种状况咱们常常会遇到:某个工做中的项目须要包含并使用另外一个项目。 也许是第三方库,或者你 独立开发的,用于多个父项目的库。 如今问题来了:你想要把它们当作两个独立的项目,同时又想在 一个项目中使用另外一个。html
Git 经过子模块来解决这个问题。 子模块容许你将一个 Git 仓库做为另外一个 Git 仓库的子目录。 它能让你将另外一个仓库克隆到本身的项目中,同时还保持提交的独立。git
git submodule add remotePath [localPath]
git clone remotePath git submodule init # 初始化本地配置文件 git submodule update # 从该项目中抓取全部数据并检出父项目中列出的合适的提交。
git fetch
git merger origin/master
git submodule update --remote
当咱们运行 git submodule update 从子模块仓库中抓取修改时,Git 将会得到这些改动并 更新子目录中的文件,可是会将子仓库留在一个称做 “游离的 HEAD” 的状态。 这意味着没有本 地工做分支(例如 “master”)跟踪改动。 因此你作的任何改动都不会被跟踪。post
git checkout stable 进入子模块并检出相应的工做分支 git submodule update --remote 从上游拉取数据 git submodule update --remote --merge 从上游拉取数据并合并
若是咱们在主项目中提交并推送但并不推送子模块上的改动,其余尝试检出咱们修改的人会遇到 麻烦,由于他们没法获得依赖的子模块改动。 那些改动只存在于咱们本地的拷贝中。fetch
为了确保这不会发生,你可让 Git 在推送到主项目前检查全部子模块是否已推送。 git push 命令接受能够设置为 check
或 on-demand
的 --recurse-submodules 参数。 若是任何提交的子模块改动没有推送那么 check
选项会直接使 push 操做失败。spa
提交主项目时自动检测子模块是否有未提交的改动code
git push --recurse-submodules=checkhtm
提交主项目时,尝试自动推送一改动的子模块blog
git push --recurse-submodules=on-demand开发
有一个 foreach 子模块命令,它能在每个子模块中运行任意命令。 若是项目中包含了大量子模块,这会很是有用。rem
你可能想为其中一些命令设置别名,由于它们可能会很是长而你又不能 设置选项做为它们的默认选项。
例如在有子模块的项目中切换分支可能会形成麻烦。 若是你建立一个新分支, 在其中添加一个子模块,以后切换到没有该子模块的分支上时,你仍然会有一个还未跟踪的子模块目录。