原文地址:http://havee.me/linux/2012-07/the-git-advanced-subtree.html

在 git 版本 1.7.9.4 中,引入了 git-subtree,基本是 用于替换 git-submodule。因为在 git-submodule 中,你只能引用别人的仓库,对于修改 git-submodule 下的子项目的代码非常麻烦,git-subtree 因此应运而生。git 官方也推荐尽量采用 git-subtree。

相比于 git-submodule 的好处是显而易见的:

  • 管理与更新便捷
  • clone全新项目不在需要如 git-submodule 那样注册 (init) 与更新 (update) 了
  • 不会再有 .gitmodule
  • 再也不用删除 submodule 时的费劲
  • 团队下,不需要另外 fork,然后 push 了

下面说下 git-subtree 的一些基本操作。

1. clone 一个远程仓库 dotfiles 到你本地

$ git clone git@github.com:Ihavee/dotfiles.git
$ cd dotfiles

2. 增加一个 subtree bash

$ git remote add bash git@github.com:Ihavee/bash.git        # 可以理解为远程仓库的别名
$ git subtree add pull -P home/.bash bash master --squash   # 拉取远程仓库 bash 到本地仓库的home/.bash 目录。

嗯,就是如此的简单。

3. 修改 subtree bash 下代码然后提交到远程 bash 的 master分支

...... edit home/.bash/file......
$ git commit -a -m 'update some'
$ git subtree push -P home/.bash bash master
$ git push origin master                                    # 顺便主项目也 push 了

4. 远程的子项目有更新了,拉下来合并

$ git subtree pull -P home/.bash bash master --squash

非常的简单,需要掌握基本的 pull 与 push 命令即可。当然还有一些其他的用法

$ git subtree -h
usage: git subtree add   --prefix=<prefix> <commit>
   or: git subtree add   --prefix=<prefix> <repository> <commit>
   or: git subtree merge --prefix=<prefix> <commit>
   or: git subtree pull  --prefix=<prefix> <repository> <refspec...>
   or: git subtree push  --prefix=<prefix> <repository> <refspec...>
   or: git subtree split --prefix=<prefix> <commit...>

在团队协作中,应用到 git-subtree 的,如果需要对 git-subtree 下子项目有修改需求的,请先 git subtree pull

参考:https://github.com/git/git/blob/master/contrib/subtree/git-subtree.txt

comments powered by Disqus