通过curl下载的repo命令只是一个引导脚本,执行命令时会在workspace中去寻找通过repo init 下载的真正的repo代码,进行命令的真正触发
.
├── command.py
├── git_command.py
├── error.py
├── manifest_xml.py
├── project.py
└── subcmds
├── __init__.py
├── config.py
├── gitee_pr.py
├── push.py
├── start.py
├── upload.py
└── version.py
subcmds目录下所有命令的父类
对间接调用git命令的封装模块
异常类
manifest_xml文件的解析模块
项目模型模块,与项目相关的基础操作模块
repo 的子命令都在此目录下
from subcmds 时对all_commands字典初始化,完成repo command与subcmds下命令模块的映射
repo config 命令对应模块
repo gitee-pr 命令对应模块
repo push 命令对应模块
def Execute(self, opt, args):
project_list = self.GetProjects(args) #获取repo push仓库列表
if opt.branch: # 判断是否传入了branch参数
branch = opt.branch
if opt.force: # 判断是否传入force参数
if len(project_list) != 1:
print('error: --force requires exactly one project', file=sys.stderr)
sys.exit(1)
if branch:
for project in project_list:
branch_tmp = branch
if (not opt.new_branch and
project.GetUploadableBranch(branch) is None): # 判断仓库是否有可推送的分支,当有new_branch参数时另外处理
continue
branch_tmp = project.GetBranch(branch_tmp)
if branch_tmp.LocalMerge:
rb = ReviewableBranch(project, branch_tmp, branch_tmp.LocalMerge) # 推送分支实例
pending.append((project, [rb])) # 加入待推送队列
if not pending:
print("no branches ready for upload", file=sys.stderr)
elif len(pending) == 1 and len(pending[0][1]) == 1: #进行单个推送或是批量推送
self._SingleBranch(opt, pending[0][1][0], reviewers)
else:
self._MultipleBranches(opt, pending, reviewers)
......
以上是我截取的repo push命令的主要逻辑,同时类比subcmds下的命令都是类似的逻辑
1、通过args参数获取需要处理的project_list(获取需要处理的仓列表)
2、通过opt参数,判断命令是否选择了相关的option进行进一步判断,进行数据处理(构造需要推送的分支)
3、拿到构造好的的待处理的数据,进行命令的主要逻辑(开始推送)
git权威指南资料 Android式多版本库协同章节其中介绍了repo
地址:http://www.worldhello.net/gotgit/04-git-model/060-android-model.html
当前版本repo 命令参考文档 :
地址:https://source.android.google.cn/setup/develop/repo?hl=zh-cn
gerrit dockerhub:
https://hub.docker.com/r/gerritcodereview/gerrit
AGit-Flow:
https://git-repo.info/zh_cn/2020/03/agit-flow-and-git-repo/
可惜只能用在AGit-Flow上
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。