马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
媒介
根据前一篇博文学习了 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分支)
- repo init -u [email protected]:openharmony/manifest.git -b master --no-repo-verify
- repo sync -c
- repo forall -c 'git lfs pull'
复制代码 这一步只是拉取了默认分支(master)的代码和对应的 LFS 文件,假如你只必要 master,可以直接跳转到反面“上传到 Gerrit”。
三、拉取全部分支及 Git LFS 文件
1. 修改 manifest 拉全分支(可选)
假如你不光是想迁移 master 分支,可以手动编辑 .repo/manifests/default.xml,把 <default> 标签的 revision="master" 改成:
- <default revision="refs/heads/master" remote="origin" sync-j="4"/>
复制代码 2. 拉取全部分支代码
- repo sync --fetch-submodules --force-sync
复制代码 3. 拉取全部堆栈全部分支的 LFS 文件
Git LFS 默认只拉当前分支的文件。我们必要一个脚本拉全部门支的全部 LFS 内容:
- repo forall -c '
- echo "进入仓库: $REPO_PATH"
- git remote set-head origin -a # 获取所有远程分支
- for branch in $(git branch -r | grep -v HEAD); do
- branch_name=${branch#origin/}
- git checkout $branch_name || git checkout -b $branch_name $branch
- git lfs pull origin $branch_name
- done
- '
复制代码 四、(可选)将 LFS 文件转为平凡 Git 文件
假如内网 Gerrit 不支持 Git LFS,可以使用 git lfs migrate export 下令将全部 LFS 文件转为平凡文件:
- repo forall -c '
- git lfs migrate export --everything --include="*" # 谨慎操作,所有 LFS 文件将嵌入历史
- '
复制代码 注意:此操纵会修改 Git 汗青,需提前关照团队并备份代码。
五、Gerrit 创建鸿蒙堆栈
创建一个父堆栈并设置好权限,让鸿蒙全部堆栈继承这个父堆栈。
1. 创建父堆栈
在 Gerrit Web 上创建堆栈 Harmony-parent(父堆栈)并设置好权限。
此中该堆栈的 owner 为 Harmony-admins 。
2. 创建子堆栈
cd 进到下载的 harmony 堆栈,并实验:
- 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数量和超时
- [receive]
- enableSignedPush = false
- maxBatchCommits = 1000000
- timeout = 120min
复制代码 然后实验:
- # 先只推heads,防止内存不足报错!Gerrit内存能最好大一点:
- repo forall -c 'echo $REPO_PROJECT; git push ssh://[email protected]:29418/Harmony/$REPO_PROJECT +refs/heads/*;'
- # 然后再推代码:
- repo forall -c 'echo $REPO_PROJECT; git push ssh://[email protected]:29418/Harmony/$REPO_PROJECT +refs/heads/* +refs/tags/*;'
复制代码 4. 后续同步更新
推送至Gerrit:
- # 若有新的Project,就建立它,已經存在的Projects會回應Fatal error,可無視:
- repo forall -c 'echo $REPO_PROJECT; ssh -p 29418 [email protected] gerrit create-project --name Harmony/$REPO_PROJECT --owner Harmony-admins --parent Harmony-parent;'
- #若有新的Project,將Parent設為Harmony-parent:
- repo forall -c 'echo $REPO_PROJECT; ssh -p 29418 [email protected] gerrit set-project-parent --parent Harmony-parent Harmony/$REPO_PROJECT'
- # 同步代码:
- repo forall -c 'echo $REPO_PROJECT; git push ssh://[email protected]:29418/Harmony/$REPO_PROJECT +refs/heads/* +refs/tags/*;'
复制代码 六、常见题目排查
1. Gerrit 不支持 LFS 锁机制
报错示例:
- Remote "origin" does not support the LFS locking API
复制代码 办理方案:
- 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 插件兼容题目。
|