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,仓库里的文件有:

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

libpng

    |

    |-- libpng.c

    |-- libpng.h

    \-- 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:


git log查看详细修改:


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

photoshop

    |

    |-- sub/

    |  |

    |  \--libpng/

    |      |

    |      |-- libpng.c

    |      |-- libpng.h

    |      \-- README.md

    |

    |-- photoshop.c

    |-- photoshop.h

    |-- main.c

    \-- README.md

注意:当你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官方推荐的工具是git subtree。 我自己也用了一段时间的git subt...
    好好编程阅读 11,899评论 0 10
  • 本文首发在segmentfault中 背景 最近工作中遇到了一个问题:随着项目越来越多,很多项目依赖同一个模板或是...
    alv阅读 7,884评论 1 5
  • 背景 项目A与项目B存在公用模块,在项目A中修改Bug或增加新功能需要同步到项目B中,由于存在区别所以还不能完全c...
    Archerlly阅读 21,059评论 3 14
  • 参考:Git Tools - Subtree MergingThe power of Git subtreegit...
    waka阅读 2,440评论 0 1
  • 一、相关网站 git官网[http://www.git-scm.com] GitLab官网[https://abo...
    Sky_Blue阅读 386评论 0 0