赞
踩
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包方式
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。