何璇

11 天前

Git Submodules vs Git Subtrees(译)

本文作者:IMWeb 何璇 原文出处:IMWeb社区 未经同意,禁止转载

原文地址:http://codewinsarguments.co/git-submodules-vs-git-subtrees/

当开发人员开始使用Git时,他们遇见的首要问题是处理当前项目的submodules。近期我打算用subtrees迁移所有项目,但看起来没那么简单。接下来我会解释一下为什么。

为什么使用Submodules or Subtrees?

每个团队都应该有公共的代码项目,submodule和subtrees可以让我们在不同项目中使用这些公共的代码,避免因复制产生重复代码,甚至导致相同代码出现不同修改产生多个版本。

Subtrees vs Submodules

最简单理解两者的方式,subtrees在父仓库是拉取下来的一份子仓库拷贝,而submodule则是一个指针,指向一个子仓库commit。

这两者的差别意味着,不需要推送更新到submodule因为我们直接提交更新到它指向的子仓库,但推送更新到subtree则显得比较复杂,因为父仓库没有子仓库相关的历史信息。

这同样意味着,开发者拉取subtree子仓库代码会比较简单,因为它作为一部分被父仓库管理着。所以我们可以过激地比较:

  • submodules推送简单,但拉取困难,因为它们是指向子仓库的指针
  • subtrees推送困难,但拉取简单,因为他们是子仓库的拷贝

接下来我会简单阐述。

git submodules 概览

添加一个submodule

如果我想添加一个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的路径及子仓库URL
  • lib/awesomelib文件夹是子仓库完整的clone
  • 子仓库的.git文件夹会存放在.git/modules目录(.git/modules/lib/awesomelib),而lib/awesomelib/.git只会包含一个引用文件,内容只有一行../../.git/modules/lib/awesomelib指向真正.git文件夹。

submodules需要与父仓库分开提交,分开切换分支。

你可能已经预见一些可能会发生的问题了,如果你忽略更新子仓库:

  • 父仓库的提交和推送,不需要子仓库先提交和推送
  • 如果协同者推送的更新包含了子仓库的修改,但你没有执行git submodule update更新子仓库,你可能得执行git add -A并降级你的子仓库

拉取submodule

实际操作就是:

  • 进入指向子仓库的文件夹
  • 拉取更新
  • 回到父仓库root文件夹
  • 提交更新后的submodule指针

推送submodule

submodules的黄金法则

submodules的问题

git subtrees概览

添加一个subtree

拉取subtree

推送subtree

subtrees的问题

总结

0条评论

    您需要 注册 一个IMWeb账号或者 才能进行评论。