24.5 git-subtree插件
git-subtree插件[1]用shell脚本开发,安装之后为Git提供了新的git subtree命令,支持前面介绍的子树合并和子树拆分。命令非常简单易用,将其他版本库以子树形式导入,再也不必和底层的Git命令打交道了。
安装Git subtree很简单,操作如下:
$git clone git://github.com/apenwarr/git-subtree.git
$cd git-subtree
$make doc
$make test
$sudo make install
下面就来介绍Git subtree的常用命令。
1.git subtree add
命令git subtree add相当于将其他版本库以子树方式加入到当前版本库。用法如下:
git subtree add[—squash]-P<prefix><commit>
git subtree add[—squash]-P<prefix><repository><refspec>
其中可选的—squash的含义是压缩为一个版本后再添加。
对于文中的示例,为了将util.git合并到main.git的lib目录,可以直接这样调用:
$git subtree add-P lib/path/to/repos/util.git master
不过推荐的方法还是先在本地建立util.git版本库的追踪分支。
$git remote add util/path/to/repos/util.git
$git fetch util
$git branch util-branch util/master
$git subtree add-P lib util-branch
2.git subtree merge
命令git subtree merge相当于将子树对应的远程分支的更新重新合并到子树中,相当于完成了git merge-s subtree操作,用法如下:
git subtree merge[—squash]-P<prefix><commit>
其中可选的—squash的含义是压缩为一个版本后再合并。
对于文章中的示例,为了将util-branch分支包含的上游的最新改动合并到master分支的lib目录中,可以直接这样调用:
$git subtree merge-P lib util-branch
3.git subtree pull
命令git subtree pull相当于先对子树对应的远程版本库执行一次git fetch操作,然后再执行git subtree merge。用法如下:
git subtree pull[—squash]-P<prefix><repository><refspec…>
对于文章中的示例,为了将util.git版本库的master分支包含的最新改动合并到master分支的lib目录中。可以直接这样调用:
$git subtree pull-P lib/path/to/repos/util.git master
更喜欢用前面介绍的git subtree merge命令,因为git subtree pull存在版本库地址写错的风险。
4.git subtree split
命令git subtree split相当于将目录拆分为独立的分支,即子树拆分。拆分后形成的分支可以推送到一个新的版本库中,进而实现用原版本库的一个子目录为根目录创建出新的版本库。用法如下:
git subtree split-P<prefix>[—branch<branch>][—onto…][—ignore-joins]
[—rejoin]<commit…>
说明:
该命令总是输出子树拆分后的最后一个commit-id。这样可以通过管道方式传递给其他命令,如git subtree push命令。
参数—branch提供拆分后创建的分支名称。如果不提供,只能通过git subtree split命令提供的提交ID得到拆分的结果。
参数—onto参数将目录拆分附加于已经存在的提交上。
参数—ignore-joins忽略对之前拆分历史的检查。
参数—rejoin会将拆分结果合并到当前分支,因为采用ours的合并策略,不会破坏当前分支。
5.git subtree push
命令git subtree push先执行子树拆分,再将拆分的分支推送到远程服务器。用法如下:
git subtree push-P<prefix><repository><refspec…>
该命令的用法和git subtree split的类似,这里就不再赘述。