本文作者:IMWeb 何璇 原文出处:IMWeb社区 未经同意,禁止转载
原文地址:http://codewinsarguments.co/git-submodules-vs-git-subtrees/
当开发人员开始使用Git时,他们遇见的首要问题是处理当前项目的submodules。近期我打算用subtrees迁移所有项目,但看起来没那么简单。接下来我会解释一下为什么。
每个团队都应该有公共的代码项目,submodule和subtrees可以让我们在不同项目中使用这些公共的代码,避免因复制产生重复代码,甚至导致相同代码出现不同修改产生多个版本。
最简单理解两者的方式,subtrees在父仓库是拉取下来的一份子仓库拷贝,而submodule则是一个指针,指向一个子仓库commit。
这两者的差别意味着,不需要推送更新到submodule因为我们直接提交更新到它指向的子仓库,但推送更新到subtree则显得比较复杂,因为父仓库没有子仓库相关的历史信息。
这同样意味着,开发者拉取subtree子仓库代码会比较简单,因为它作为一部分被父仓库管理着。所以我们可以过激地比较:
接下来我会简单阐述。
如果我想添加一个submodule到当前仓库,可以运行:
$ git submodule add https://github.com/mowen/awesomelib lib/awesomelib
Cloning into ‘lib/awesomelib’…
remote: Counting objects: 11, done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 11 (delta 0), reused 11 (delta 0)
Unpacking objects: 100% (11/11), done.
Checking connectivity... done.然后我运行git status命令:
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>…" to unstage)
new file: .gitmodules
new file: lib/awesomelib会发现.gitmodules文件被新建,内容为:
[submodule “lib/awesomelib”]
path = lib/awesomelib
url = https://github.com/mowen/awesomelib所以添加一个submodule会:
.gitmodules文件被建立,内容包括submodule的路径及子仓库URLlib/awesomelib文件夹是子仓库完整的clone.git文件夹会存放在.git/modules目录(.git/modules/lib/awesomelib),而lib/awesomelib/.git只会包含一个引用文件,内容只有一行../../.git/modules/lib/awesomelib指向真正.git文件夹。submodules需要与父仓库分开提交,分开切换分支。
你可能已经预见一些可能会发生的问题了,如果你忽略更新子仓库:
git submodule update更新子仓库,你可能得执行git add -A并降级你的子仓库实际操作就是: