git subtree使用体验


git subtree


旧版本的git也支持(最老版本可以到 v1.5.2).

详细了解先看这篇文章,写的挺好:https://tech.youzan.com/git-subtree/

 

下面介绍具体操作:

1、初始化subtree项目

在主项目根目录的下面

git subtree add  --prefix=用来放S项目的相对路径   S项目git地址  xxx分支

例如:git subtree add --prefix=modules/MultiMedia/TVKPlayer_Android/ http://git.code.oa.com/XXX_Android.git tvideo/765

例如:git subtree add --prefix=modules/MultiMedia/ThumbPlayer/ http://git.code.oa.com/XXX_Android.git tvideo/765 --squash

 

问题1:如果subtree中有lfs的话,会add失败

解决方法: 先执行git lfs install --skip-smudge,再add

 

解释:

–prefix之后的=等号也可以用空格

问题:永远也解不完的冲突

–squash意思是把subtree的改动合并成一次commit,这样就不用拉取子项目完整的历史记录。

主项目的历史记录看起来还是比较整齐的。 但在子项目有更新,需要 subtree pull 的时候,却经常需要处理冲突。 严重的,在每次 subtree pull 的时候都需要重复处理同样的冲突,非常烦人

如果不使用 --squash 参数,子项目更新的时候,subtree pull 很顺利, 能够自动处理已解决过的冲突,缺点就是子项目的更新记录“污染”了主项目的

 

2、pull代码到父项目:

git subtree pull --prefix=S项目的路径   S项目git地址  xxx分支

例如:git subtree pull --prefix=modules/MultiMedia/TVKPlayer_Android/ http://git.code.oa.com/XXX_Android.git tvideo/765

例如:git subtree pull --prefix=modules/MultiMedia/ThumbPlayer/ http://git.code.oa.com/XXX_Android.git tvideo/765 --squash

 

3、push代码到subtree的仓库

在主项目的根目录下面:

git subtree push --prefix=S项目的路径   S项目git地址   xxx分支

例如: git subtree push --prefix=modules/MultiMedia/TVKPlayer_Android/ http://git.code.oa.com/XXX_Android.git tvideo/765

例如: git subtree push --prefix=modules/MultiMedia/ThumbPlayer/ http://git.code.oa.com/XXX_Android.git tvideo/765

git subtree merge --prefix=

 

给子仓库取一个好记的名字,为了后面使用方便

语法:git remote add -f

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

 

问题2:当主项目的 commit 提交太多后,再推送子项目到远程库的时候,subtree 每次都要遍历很多 commit,浪费的时间相当多,很是不爽。

解决方法:split打点,作为下次遍历的起点。

git subtree split --rejoin --prefix= --branch

例如:git subtree split --rejoin --prefix=themes/icarus --branch icarus

这个分支只是作起点储存用的,不用管它不用修改不用推送到远程库。下次使用相同的命令更新这个起点就可以了。

git subtree split --rejoin --prefix=modules/MultiMedia/ThumbPlayer/ --branch icarus

 

git 列出所有的 subtree

git log | grep git-subtree-dir | tr -d ' ' | cut -d ":" -f2 | sort | uniq

 

git subtree pull fatal refusing to merge unrelated histories问题

1. 用 git subtree add 是對的!

2. 記得下完 git subtree add 後,一定要多下一個下面的指令!

記得下完 git subtree add 後,一定要多下一個下面的指令!

記得下完 git subtree add 後,一定要多下一個下面的指令!

因為很重要所以說三次

git merge -s ours --no-commit --allow-unrelated-histories shareLibraryRepo/master

這行指令就是建立好 subtree 關係的關鍵步驟啊!!!(抱頭)就差了這一個步驟,所以讓我一開始會遇到 refusing to merge unrelated histories 的錯誤訊息 

git merge -s ours --no-commit --allow-unrelated-histories http://git.code.oa.com/XXX_Android.git tvideo/765

git merge -s ours --no-commit --allow-unrelated-histories http://git.code.oa.com/XXX_Android.git tvideo/765_test

git merge -s ours --no-commit --allow-unrelated-histories http://git.code.oa.com/XXX_Android.git tvideo/765_test

注:我在使用的时候好像没有使用这个命令

 

总体来说,git subTree 不是很好用,,首先是有上面提交的2个问题,体验上就不太好了。

如果不设计代码的双向同步,,可以考虑使用maven包方式

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值