使用Subrepo大小仓库同步开发reL4指南

大小仓库的开发须知请看: .github/profile/rel4多仓开发提案.md at main · kern-crates/.github 当前大仓库位于:https://github.com/rel4team/mi-dev-integral-rel4 包含了众多的小仓库信息 包含的小仓库有:

urls=("git@github.com:rel4team/sel4_common.git"
    "git@github.com:rel4team/sel4_task.git"
    "git@github.com:rel4team/sel4_ipc.git "
    "git@github.com:rel4team/sel4_vspace.git"
    "git@github.com:rel4team/sel4_cspace.git"
    "git@github.com:rel4team/rel4_kernel.git"
    "git@github.com:rel4team/driver-collect.git"
    "git@github.com:rel4team/serial-impl-pl011.git"
    "git@github.com:rel4team/serial-impl-sbi.git"
    "git@github.com:rel4team/serial-frame.git"
)

大仓库中的全部更新,会通过CI自动将相关的commit信息更新到小仓库当中,反过来,小仓库中的任何更新也会在大仓库中进行同步。 接下来分别介绍从大仓库 和 小仓库端的更新方法

代码提交到大仓库的方法举例说明

依次执行以下指令:

  • git pull #因为大小仓库任意一端都有可能更新,每次开发前需要保证大仓库中的内容是最新的
  • 完成修改后,使用git add . && git commit -m "COMMIT_MESSAGE" && git push将修改push 到远端分支。
  • 此时在History中应该能看到类似的两条commit信息,第一条commit信息是我们自己的包含COMMIT_MESSAGE的信息,是我们自己的修改,会进行五项CI测试,包含aarch riscv平台的kernel build 、sel4test运行以及大小仓库的同步CI,第二条COMMIT信息则是git subrepo +COMMIT_MESSAGE,是大仓库记录和小仓库对应commit版本的对应信息,只更新.gitsubrepo中的commit(小仓库中最新的commit id)和parent(大仓库中COMMIT_MESSAGE对应的commit id)两项内容。image.png
  • 最后需要git pull将第二次commit修改pull下拉,从而完成一次修改。

相较于普通的git使用来说,仅增加了最后的 git pull 一个步骤。

代码提交到小仓库的方法

正常使用git即可,没有什么特别。

注意事项

  1. 大仓库每次push之后必须要跟一次pull,否则commit记录会乱掉
  2. 小仓库每次push的最新commit信息应该保证不与大仓库最新commit信息存在真子集的关系(谁是谁的真子集均不被允许),如一方是“Hello World”,一方是“Hello”。
  3. 大仓库commit信息应该不包含"git subrepo"这一子字符串,CI会检测此字符串来选择是否进行push到小仓库中。

从仓库中分离文件夹作为单独仓库的方法

当从大仓库分离文件夹进入子仓库时,希望修改对应的文件夹的log可以保留,可以使用如下方法: 以polyhal的example文件夹为例,polyhal的commit log信息如下: image.png 其中与example文件夹相关的是8.5号的feat:release 0.1.3 version commit记录: image.png 使用如下命令:

git subtree split -P example -b example  # -P path -b branch

就会创建一个新的分支example,其中的文件即为example中的文件,commit记录也为example文件夹的修改记录: image.png