目前工作:
获取了RK3288-Linux的,RK原厂的SDK-mirror并搞到了本地gitlab服务器上创建了个本地的repo镜像仓,目前可以使用手册中repo init/repo sync等类似方式从内部服务器上搞到SDK代码
遇到的问题:
目前有十几个产品都是基于rk3288-linux进行开发实现,其中大部分的一些修改配置各个产品都是一致的,只有一些产品对应的应用程序、配置文件、开机脚本、不分外设驱动、屏幕参数等不一致。
请问怎么基于git-repo进行管理啊,目前想法是每个产品对应一个xml清单,开发不同产品时候切换到不同的xml,正好对目标产品xml对应产品固件release版本。
但是如果比如说有kernel中某个公共修改,怎么同步到各个产品啊
通过查看git文档,首先考虑使用git filter-branch命令来进行迁移。简单来说该命令可以用来操作目录树,同时修改 历史 提交记录。
在我还没来得及完全理解这个命令之前,就看到文档中有这样一段warning
这里提到了filter-branch命令由于有可能产生杂乱的提交 历史 ,以及惨不忍睹的执行效率,所以最终推荐了一个第三方工具git filter-repo。
在github首页上,关于git-filter-repo有这样的描述
接下来我们考虑如何利用这个强大的工具来进行git项目的迁移。
首先,需要定义成功迁移的标准:
查看git-filter-repo的文档可以看到有不少简单的示例,很幸运有一些例子正好可以解决我们的问题。
git-filter-repo的命令选项 (flag) 主要用来操作目录树,根据操作的目录树自动判断需要修改的git提交 历史 信息。
比如我们需要保留webapp目录,删除server目录,那么仅需执行:
这样仓库中的目录结构就会变为:
已经没有server文件夹了。
再比如如果我们希望删除.DS_Store文件以及其提交 历史 :
当然通常我们需要删除根目录下所有.DS_Store文件及其 历史 ,那么可以加上--use-base-name选项,表示匹配文件名,而不是匹配完整路径:
其中 --path 选项后跟需要操作的路径或者文件名,--invert-paths选项字面意思是反向,因此该标记表示的是删除操作。
以上都是删除某些文件或者保留某些文件的操作,其目录结构仍然会保留原始仓库的结构,但我们需要的是仅保留webapp目录下的所有文件,并将其中的内容移动到根目录下。针对这种场景git-filter-repo提供了一个叫做--subdirectory-filter的选项,接下来就进行实际操作。
接下来再看一下老的仓库目录结构
仅保留webapp目录下的内容,并让其成为新的根目录,执行如下命令:
执行结果的目录结构如下所示:
至此,目录结构已经如愿完成,为了确认迁移的 历史 记录也是完整的,执行
如果确认本地仓库的迁移结果正确,再执行命令将当前本地仓库推向迁移的目的仓库即可:
至此我们的git项目迁移就完成了,不仅将代码迁移到新的仓库,也同时将提交 历史 带去了新的仓库。这样一来,对于开发同学来说迁移完全是无痛的,只是切换了新的git地址,而开发过程完全不会中断。
在git项目需要迁移的场景中,日常工作中也许第一反应就是让开发同学们放下手中的工作,全部推向一个指定用于迁移的分支,然后以这个分支为准,下载源代码,再将其推送到新的仓库中。
这种操作方式虽然简单,但是对于开发同学来说,却会造成很多麻烦。
比如新仓库的代码不仅含有自己未开发完成的代码,也含有其他人未完成的代码,很有可能在迁移完成之后项目都跑不起来。
而除此以外,如果新仓库的代码有一个需要很快就上线的功能,或者紧急修复,面对一个百废待兴的新仓库,如何整理出一个可以上线的代码版本,又是一件非常头大的事情。
git-filter-branch可以帮助我们修改目录树和提交 历史 ,但是执行效率和混乱的提交 历史 显得太过于繁琐。
git-filter-repo工具提供了强大的工具集,良好的用户使用界面,以及高效率的处理机制,在目前确实是处理仓库迁移的最优选择。