很多时候 ,"子模块"(submodule)功能不能满足手边的任务。例如,合并多个仓库到一个仓库时,要维护每一个仓库的历史记录。对于这种情况,子树(subtree)合并策略是一个更好的解决方案。
建立仓库,完成第一个合并
在这个例子中,我们建立一个空的“父”仓库,合并别的仓库作为它的子路径。
首先,建立一个空的仓库:
$ mkdir test$ cd test$ git init# Initialized empty Git repository in /Users/tekkub/tmp/test/.git/$ touch .gitignore$ git add .gitignore$ git commit -m "initial commit"# [master (root-commit) 3146c2a] initial commit# 0 files changed, 0 insertions(+), 0 deletions(-)# create mode 100644 .gitignore
现在,子树合并 到仓库的/cork目录下:
$ git remote add -f cork git://github.com/TekNoLogic/Cork.git# Updating cork# warning: no common commits# remote: Counting objects: 1732, done.# remote: Compressing objects: 100% (750/750), done.# remote: Total 1732 (delta 1086), reused 1558 (delta 967)# Receiving objects: 100% (1732/1732), 528.19 KiB | 621 KiB/s, done.# Resolving deltas: 100% (1086/1086), done.# From git://github.com/tekkub/cork# * [new branch] lastbuffed -> cork/lastbuffed# * [new branch] lock_n_mount -> cork/lock_n_mount# * [new branch] master -> cork/master# * [new branch] nothing_to_see_here -> cork/nothing_to_see_here$ git merge -s ours --no-commit cork/master# Automatic merge went well; stopped before committing as requested
接下来,我们合并到仓库的panda/目录下
$ git remote add -f panda git://github.com/TekNoLogic/Panda.git# Updating panda# warning: no common commits# remote: Counting objects: 974, done.# remote: Compressing objects: 100% (722/722), done.# remote: Total 974 (delta 616), reused 399 (delta 251)# Receiving objects: 100% (974/974), 189.56 KiB, done.# Resolving deltas: 100% (616/616), done.# From git://github.com/tekkub/panda# * [new branch] master -> panda/master# * [new branch] transmute -> panda/transmute$ git merge -s ours --no-commit panda/master# Automatic merge went well; stopped before committing as requested$ git read-tree --prefix=panda/ -u panda/master$ git commit -m "Subtree merged in panda"# [master 726a2cd] Subtree merged in panda
最后,我们将要把tekkub/cork的子目录modules/合并到仓库的cork2/目录结构下。
$ git merge -s ours --no-commit cork/master# Automatic merge went well; stopped before committing as requested$ git read-tree --prefix=cork2/ -u cork/master:modules$ git commit -m "Subtree merged in cork/modules"# [master f240057] Subtree merged in cork/modules
目录结构为
Mode LastWriteTime Length Name
---- ------------- ------ ----d---- 2013/3/13 12:45 corkd---- 2013/3/13 12:50 cork2d---- 2013/3/13 12:48 panda----- 2013/3/13 12:36 0 .gitignore获取修改
如果将来被合并的仓库中有修改,你只要简单的使用-s subtree标记获取他们的修改。
$ git pull -s subtree panda master
原文链接: