拆分LibraryC
cd 项目A
git subtree split -P LibraryC -b tempLibraryC (把libraryC抽离为tempLibraryC)
cd ../
mkdir tempDir
cd tempDir
git init
git pull ../项目A tempLibraryC
git remote add origin git@192.168.1.123:rep/libraryC.git
git push origin -u master
git filter-branch -f --index-filter "git rm -r -f -q --cached --ignore-unmatch LibraryC" --prune-empty HEAD //清理掉原来的commit记录
cd 项目B
git remote add libraryc git@192.168.1.123:rep/libraryC.git //添加源
git subtree add --prefix LibraryC libraryc master //后三个参数分别是:目录、源名称、分支名
git subtree pull --prefix LibraryC libraryc master //更新代码
git subtree push --prefix LibraryC libraryc master //提交代码
语法:git fetch <远程仓库名> <分支>
示例
git fetch ai master
$git subtree pull --prefix=ai ai --squash
或者
git subtree pull --prefix=ai --squash git@github.com:aoxu/ai.git master
示例
git subtree push --prefix=ai ai master
big-project
├── codes-a
├── codes-b
└── codes-eiyo
有时候想把 codes-eiyo
拆出来做为一个独立仓库;有时候是想把 codes-eiyo
清理掉,只保留剩下的代码在仓库中。现在就来分别看看这两件事情怎么干:
以前是用 filter-branch 来实现,这个需求太常见了,有人做了个整合的 git-subtree,再后来……subtree
集成进 Git 了。
# 这就是那个大仓库 big-project
$ git clone git@github.com:tom/big-project.git
$ cd big-project
# 把所有 `codes-eiyo` 目录下的相关提交整理为一个新的分支 eiyo
$ git subtree split -P codes-eiyo -b eiyo
# 另建一个新目录并初始化为 git 仓库
$ mkdir ../eiyo
$ cd ../eiyo
$ git init
# 拉取旧仓库的 eiyo 分支到当前的 master 分支
$ git pull ../big-project eiyo
这个还是要用万能的 filter-branch
:
# 还是那个大仓库 big-project
$ git clone git@github.com:tom/big-project.git
$ cd big-project
# 清理 `master` 分支上所有跟 `codes-eiyo` 目录有关的痕迹
$ git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch codes-eiyo" --prune-empty master
# 另建一个新目录并初始化为 git 仓库
$ mkdir ../big-project-fresh
$ cd ../big-project-fresh
$ git init
# 拉取 `big-project` 的 `master` 分支(到新仓库的 master 分支)
$ git pull ../big-project master
记得用 count-objects
命令比较新旧仓库的差异(爽爽爽):
$ git count-objects -vH
接下来要推送给新的远端仓库什么的就随你便了~
$ git remote add origin git://github.com:tom/fresh-project.git
$ git push origin -u master
针对第一段的3条需求,我分别说明具体的命令。
建立关联总共有2条命令。
解释:其中-f意思是在添加远程仓库之后,立即执行fetch。
解释:–squash意思是把subtree的改动合并成一次commit,这样就不用拉取子项目完整的历史记录。–prefix之后的=等号也可以用空格。
示例
$git remote add -f ai https://github.com/aoxu/ai.git
$git subtree add --prefix=ai ai master --squash
语法:git fetch <远程仓库名> <分支>
示例
$git fetch ai master
$git subtree pull --prefix=ai ai --squash
示例
$git subtree push --prefix=ai ai master
因篇幅问题不能全部显示,请点此查看更多更全内容