2015
Mar
05

网页好读版


什么是 Git Submodule

Submodule 可以让我们的 git repository 里内嵌多个外部的 remote repository,并将这个 remote repository 下载回你指定的目录,这个 repository 不一定要是最新的内容,我们也可以指定一个 "Git commit object",每次 git clone 时,都会 clone 到 commit object 当下的内容, 确保程式不会因为第三方的修改而被影响。

Submodule 跟 Remote Repository 是不一样的定义,使用 Remote Repository 的时机点,是当两个 repository 属於同一个 Project,而 Submodule 则是指两个 repository 是不同的 project ,例如 A ,B 是两个不同的 Project ,但是 A 会用到 B 的功能,所以我可以将 B 以 submodule 的方式放进 A,让 B 成为 A 的一部分,但是 A 与 B 仍然是独立的两个 Project ,所以我不能去修改 B 的程式码。

如果你想将两个 Project 的程式码,整合成同一个,而且有共同的 git commit log ,那么你可以使用 Remote Repository 来取代 submodule ,再使用 subtree merge 的方式来 Merge 另一个 repository,这样操作这两个 Repository 时,就像是在操作同一个 Repository, 并且可以用 git clone, git checkout 等指令,同时操作两个 Repository。

Gitlink tree

Gitlink tree 是一个很重要的观念,如果你想使用 submodule ,那么你一定要学懂 Gitlink tree,Gitlink 是连结 git repository 中的某一个 commit object ( 例如 70460b4b4aece5915caf5c68d12f56xxxx),每一个 submodule 都会连结一个 Gitlink,当你 checkout 这个 submodule 时,只会 checkout commit object 当下的资料,而不会是 repository 最新的 commit 资料, 等同於我们可以锁死 submodule 某一个时间点的资料。

当你在 Git 中加入了一个 submodule ,那么你的 Project 根目录会有一个档案 .gitmodules,里面会记录 submodule 的 git repository 路径与对应的目录。


Submodule 操作指令

git submodule add

如何加入一个 submodule

git submodule add git@github.com:user/third-party-project.git ./lib/third-party

git clone --recursive

clone project code 并且 clone 这个 project 内的所有 submodule

git clone --recursive git://github.com/user/myProject.git

git submodule update

预设 git 不会自动 checked out submodule 的资料,你可以用这个指令来 checked out submodule

git submodule update --init --recursive

git submodule init

git submodule init 这个指令会将 .gitmodules 档案里面的资料,复制一份到 .git/config 。


git submodule deinit

git submodule deinit 这个指令会将 submodule 的资料从 .git/config 中移除,当 submodule 没有定义在 .git/config ,则以下三个指令将无法使用。

  • git submodule update
  • git submodule foreach
  • git submodule sync

参考资料

网页好读版