git subtree的使用

1.如果LibraryC已经在使用subtree之前被项目A引用

拆分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记录

2.在项目B中使用LibraryC

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 //提交代码

从远程仓库pull更新子目录


更新子目录有2条命令.

语法:git fetch <远程仓库名> <分支>

语法:git subtree pull –prefix=<子目录名> <远程分支> <分支> –squash

示例

git fetch ai master  
$git subtree pull --prefix=ai ai --squash
  • 1
  • 2

或者

git subtree pull --prefix=ai --squash git@github.com:aoxu/ai.git master
  • 1

从子目录push到远程仓库


推送子目录的变更有1条命令.

语法:git subtree push –prefix=<子目录名> <远程分支名> 分支

示例

git subtree push --prefix=ai ai master





比如你有一个叫做 big-project 的仓库,目录如下:

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

Before & After

记得用 count-objects 命令比较新旧仓库的差异(爽爽爽):

$ git count-objects -vH

接下来要推送给新的远端仓库什么的就随你便了~

$ git remote add origin git://github.com:tom/fresh-project.git
$ git push origin -u master

git subtree用法

使用场景

例如,在项目Game中有一个子目录AI。Game和AI分别是一个独立的git项目,可以分开维护。为了避免直接复制粘贴代码,我们希望Game中的AI子目录与AI的git项目关联,有3层意思:

AI子目录使用AI的git项目来填充,内容保持一致。 
当AI的git项目代码有更新,可以拉取更新到Game项目的AI子目录来。 
反过来,当Game项目的AI子目录有变更,还可以推送这些变更到AI的git项目。 
用git subtree可以轻松满足上面的需求。

git subtree用法

针对第一段的3条需求,我分别说明具体的命令。

1. 第一次添加子目录,建立与git项目的关联

建立关联总共有2条命令。

语法:git remote add -f <子仓库名> <子仓库地址>

解释:其中-f意思是在添加远程仓库之后,立即执行fetch。

语法:git subtree add –prefix=<子目录名> <子仓库名> <分支> –squash

解释:–squash意思是把subtree的改动合并成一次commit,这样就不用拉取子项目完整的历史记录。–prefix之后的=等号也可以用空格。

示例

$git remote add -f ai https://github.com/aoxu/ai.git  
$git subtree add --prefix=ai ai master --squash
  • 1
  • 2

2. 从远程仓库更新子目录

更新子目录有2条命令。

语法:git fetch <远程仓库名> <分支>

语法:git subtree pull –prefix=<子目录名> <远程分支> <分支> –squash

示例

$git fetch ai master  
$git subtree pull --prefix=ai ai --squash
  • 1
  • 2

3. 从子目录push到远程仓库(确认你有写权限)

推送子目录的变更有1条命令。

语法:git subtree push –prefix=<子目录名> <远程分支名> 分支

示例

$git subtree push --prefix=ai ai master

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值