git subtree教程

作者: 好好编程 | 来源:发表于2017-11-14 11:08 被阅读144次

关于子仓库或者说是仓库共用,git官方推荐的工具是git subtree。 我自己也用了一段时间的git subtree,感觉比git submodule好用,但是也有一些缺点,在可接受的范围内。
所以对于仓库共用,在git subtree 与 git submodule之中选择的话,我推荐git subtree。

git subtree是什么?为什么使用git subtree

git subtree 可以实现一个仓库作为其他仓库的子仓库。


image

使用git subtree 有以下几个原因:

  • 旧版本的git也支持(最老版本可以到 v1.5.2).
  • git subtree与git submodule不同,它不增加任何像.gitmodule这样的新的元数据文件.
  • git subtree对于项目中的其他成员透明,意味着可以不知道git subtree的存在.

当然,git subtree也有它的缺点,但是这些缺点还在可以接受的范围内:

  • 必须学习新的指令(如:git subtree).
  • 子仓库的更新与推送指令相对复杂。

git subtree 的使用

git subtree的主要命令有:

git subtree add   --prefix=<prefix> <commit>
git subtree add   --prefix=<prefix> <repository> <ref>
git subtree pull  --prefix=<prefix> <repository> <ref>
git subtree push  --prefix=<prefix> <repository> <ref>
git subtree merge --prefix=<prefix> <commit>
git subtree split --prefix=<prefix> [OPTIONS] [<commit>]

准备

我们先准备一个仓库叫photoshop,一个仓库叫libpng,然后我们希望把libpng作为photoshop的子仓库。
photoshop的路径为https://github.com/test/photoshop.git,仓库里的文件有:

photoshop
    |
    |-- photoshop.c
    |-- photoshop.h
    |-- main.c
    \-- README.md

libPNG的路径为https://github.com/test/libpng.git,仓库里的文件有:

libpng
    |
    |-- libpng.c
    |-- libpng.h
    \-- README.md

以下操作均位于父仓库的根目录中。

在父仓库中新增子仓库

我们执行以下命令把libpng添加到photoshop中:

git subtree add --prefix=sub/libpng https://github.com/test/libpng.git master --squash

(--squash参数表示不拉取历史信息,而只生成一条commit信息。)

执行git status可以看到提示新增两条commit:

image

git log查看详细修改:

image

执行git push把修改推送到远端photoshop仓库,现在本地仓库与远端仓库的目录结构为:

photoshop
    |
    |-- sub/
    |   |
    |   \--libpng/
    |       |
    |       |-- libpng.c
    |       |-- libpng.h
    |       \-- README.md
    |
    |-- photoshop.c
    |-- photoshop.h
    |-- main.c
    \-- README.md

注意,现在的photoshop仓库对于其他项目人员来说,可以不需要知道libpng是一个子仓库。什么意思呢?
当你git clone或者git pull的时候,你拉取到的是整个photoshop(包括libpng在内,libpng就相当于photoshop里的一个普通目录);当你修改了libpng里的内容后执行git push,你将会把修改push到photoshop上。
也就是说photoshop仓库下的libpng与其他文件无异。

从源仓库拉取更新

如果源libpng仓库更新了,photoshop里的libpng如何拉取更新?使用git subtree pull,例如:

git subtree pull --prefix=sub/libpng https://github.com/test/libpng.git master --squash

推送修改到源仓库

如果在photoshop仓库里修改了libpng,然后想把这个修改推送到源libpng仓库呢?使用git subtree push,例如:

git subtree push --prefix=sub/libpng https://github.com/test/libpng.git master

简化git subtree命令

我们已经知道了git subtree 的命令的基本用法,但是上述几个命令还是显得有点复杂,特别是子仓库的源仓库地址,特别不方便记忆。
这里我们把子仓库的地址作为一个remote,方便记忆:

git remote add -f libpng https://github.com/test/libpng.git

然后可以这样来使用git subtree命令:

git subtree add --prefix=sub/libpng libpng master --squash
git subtree pull --prefix=sub/libpng libpng master --squash
git subtree push --prefix=sub/libpng libpng master

更多

相关文章

  • git subtree 的命令和使用说明

    git subtree add --prefix= git subtree add --...

  • git subtree教程

    关于子仓库或者说是仓库共用,git官方推荐的工具是git subtree。 我自己也用了一段时间的git subt...

  • git subtree 的使用

    参考:Git Tools - Subtree MergingThe power of Git subtreegit...

  • git merge two repos

    git clone git_linkFirstly add subtree, from which you wan...

  • Git依赖subtree

    Git依赖——subtree  与submodule相比,subtree的优势在于主项目与子模块的双向 通信,即主...

  • git subtree

    使用GIT SUBTREE集成项目到子目录 使用场景 例如,在项目Game中有一个子目录AI。Game和AI分别是...

  • git subtree

    在生成gitHub page ,打算将打包的doc 文件单独作为一个github page 分支时候了解到一个gi...

  • git subtree

    git subtree 1.在A项目中添加一个远程连接如下: 2.使用subtree命令添加需要依赖的远程仓库 3...

  • git-subtree

    多个工程,存在通用目录或文件内容 举例 工程P1,目录结构: src1utils1test.jsp1.js 工程P...

  • 版本库之间的依赖

    Git submodule和Git subtree 与子模块之间的依赖 对于子模块来说,其模块版本库可以被嵌入到主...

网友评论

    本文标题:git subtree教程

    本文链接:https://www.haomeiwen.com/subject/zrmxvxtx.html