怎样完备迁移鸿蒙代码(含Git LFS文件)到内网Gerrit堆栈

[复制链接]
发表于 2025-9-17 21:34:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
媒介

根据前一篇博文学习了 Git LFS Git LFS 学习条记:原理、设置、实践与心路历程,那就遐想到另一个题目,既然 LFS 文件是根据当前分支/版本去下载,而不是全部版本都下载,那该怎样把全部全部版本全量同步到内网堆栈上?
这里把鸿蒙代码推送到内网Gerrit堆栈上。
鸿蒙代码官网:https://www.openharmony.cn/download/
操纵参考链接:
https://c55jeremy-tech.blogspot.com/2019/04/gerrit-serveraosp-codebase-part-23.html
https://nativeguru.wordpress.com/2015/05/22/how-to-set-local-aosp-gerrit-server-part-1/
   以下内容均为个人理解总结,部门尚未在生产项目中验证,仅供回首与参考。
  
一、情况预备

确保本地已安装如下工具:


  • repo 工具
  • git-lfs
  • git
  • 拥有内网 Gerrit 的 SSH 写权限

二、鸿蒙官方代码初始化拉取(master分支)

  1. repo init -u [email protected]:openharmony/manifest.git -b master --no-repo-verify
  2. repo sync -c
  3. repo forall -c 'git lfs pull'
复制代码
这一步只是拉取了默认分支(master)的代码和对应的 LFS 文件,假如你只必要 master,可以直接跳转到反面“上传到 Gerrit”。

三、拉取全部分支及 Git LFS 文件

1. 修改 manifest 拉全分支(可选)

假如你不光是想迁移 master 分支,可以手动编辑 .repo/manifests/default.xml,把 <default> 标签的 revision="master" 改成:
  1. <default revision="refs/heads/master" remote="origin" sync-j="4"/>
复制代码
2. 拉取全部分支代码

  1. repo sync --fetch-submodules --force-sync
复制代码
3. 拉取全部堆栈全部分支的 LFS 文件

Git LFS 默认只拉当前分支的文件。我们必要一个脚本拉全部门支的全部 LFS 内容:
  1. repo forall -c '
  2.   echo "进入仓库: $REPO_PATH"
  3.   git remote set-head origin -a  # 获取所有远程分支
  4.   for branch in $(git branch -r | grep -v HEAD); do
  5.     branch_name=${branch#origin/}
  6.     git checkout $branch_name || git checkout -b $branch_name $branch
  7.     git lfs pull origin $branch_name
  8.   done
  9. '
复制代码

四、(可选)将 LFS 文件转为平凡 Git 文件

假如内网 Gerrit 不支持 Git LFS,可以使用 git lfs migrate export 下令将全部 LFS 文件转为平凡文件:
  1. repo forall -c '
  2.   git lfs migrate export --everything --include="*"  # 谨慎操作,所有 LFS 文件将嵌入历史
  3. '
复制代码
注意:此操纵会修改 Git 汗青,需提前关照团队并备份代码。

五、Gerrit 创建鸿蒙堆栈

创建一个父堆栈并设置好权限,让鸿蒙全部堆栈继承这个父堆栈。
1. 创建父堆栈

在 Gerrit Web 上创建堆栈 Harmony-parent(父堆栈)并设置好权限。
此中该堆栈的 owner 为 Harmony-admins 。
2. 创建子堆栈

cd 进到下载的 harmony 堆栈,并实验:
  1. repo forall -c 'echo $REPO_PATH; ssh -p 29418 [email protected] gerrit create-project --name Harmony/$REPO_PATH --owner Harmony-admins --parent Harmony-parent;'
复制代码
3. 推送代码

修改Gerrit参数并重启,防止超Commit数量和超时
  1. [receive]
  2.         enableSignedPush = false
  3.         maxBatchCommits = 1000000
  4.         timeout = 120min
复制代码
然后实验:
  1. # 先只推heads,防止内存不足报错!Gerrit内存能最好大一点:
  2. repo forall -c 'echo $REPO_PROJECT; git push ssh://[email protected]:29418/Harmony/$REPO_PROJECT +refs/heads/*;'
  3. # 然后再推代码:
  4. repo forall -c 'echo $REPO_PROJECT; git push ssh://[email protected]:29418/Harmony/$REPO_PROJECT +refs/heads/* +refs/tags/*;'
复制代码
4. 后续同步更新

  1. cd 鸿蒙仓库
  2. repo sync -f -j4
复制代码
推送至Gerrit:
  1. # 若有新的Project,就建立它,已經存在的Projects會回應Fatal error,可無視:
  2. repo forall -c 'echo $REPO_PROJECT; ssh -p 29418 [email protected] gerrit create-project --name Harmony/$REPO_PROJECT --owner Harmony-admins --parent Harmony-parent;'
  3. #若有新的Project,將Parent設為Harmony-parent:
  4. repo forall -c 'echo $REPO_PROJECT; ssh -p 29418 [email protected] gerrit set-project-parent --parent Harmony-parent Harmony/$REPO_PROJECT'
  5. # 同步代码:
  6. repo forall -c 'echo $REPO_PROJECT; git push ssh://[email protected]:29418/Harmony/$REPO_PROJECT +refs/heads/* +refs/tags/*;'
复制代码

六、常见题目排查

1. Gerrit 不支持 LFS 锁机制

报错示例:
  1. Remote "origin" does not support the LFS locking API
复制代码
办理方案:
  1. git config lfs.https://gerrit.intranet.com/info/lfs.locksverify false
复制代码
2. git-lfs-authenticate: not found

阐明 Gerrit 没设置 Git LFS 认证插件。假如你确认不必要 LFS 锁和认证,可以直接跳过相干设置或禁用锁校验。

七、结语

迁移鸿蒙这类使用 Git LFS 的大型开源项目到内网堆栈,光是 repo sync 和 git lfs pull 远远不敷。通常必要额外处置处罚多分支、多 tag、大文件迁移以及大概存在的 LFS 插件兼容题目。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表