当前位置: 首页 > news >正文

repo仓库转移到自己本地的git服务器

前提条件:搭建好gitolite
以转移正点原子rk3568_linux工程为例子,将其转移到自己的git服务器。

获取完整repo仓库

将正点原子epo仓库sync出来

evan@evan-X99:~/SRC/atk$ .repo/repo/repo sync -l -j10
evan@evan-X99:~/SRC/atk$ .repo/repo/repo list -n > ·/project.txt
evan@evan-X99:~/SRC/atk$ cat project.txt
android/rk/platform/system/rk_tee_user
android/rk/u-boot
linux/alientek/qt_demo
linux/app-new/LibIPCProtocol
linux/app-new/qfm
linux/app/QLauncher
linux/app/aiserver
linux/app/dbserver
linux/app/eptz_demo
linux/app/libgdbus
linux/app/librkdb
linux/app/multivideoplayer
linux/app/qcamera
linux/app/qplayer
linux/app/rkaiq_tool_server......

创建仓库

gitolite创建@atk-at3568_linux_repo组,project路径和正点原子的repo一样:

evan@evan-X99:~/tools/gitolite-admin$ git diff
diff --git a/conf/gitolite.conf b/conf/gitolite.conf
index 47bb499..9bb5dad 100644
--- a/conf/gitolite.conf
+++ b/conf/gitolite.conf
@@ -3,3 +3,74 @@ repo gitolite-adminrepo testingRW+     =   @all
+
+@atk-at3568_linux_repo = atk-rk3568_linux/android/rk/platform/system/rk_tee_user
+@atk-at3568_linux_repo = atk-rk3568_linux/android/rk/u-boot
+@atk-at3568_linux_repo = atk-rk3568_linux/linux/alientek/qt_demo
+@atk-at3568_linux_repo = atk-rk3568_linux/linux/app-new/LibIPCProtocol
...
...
+@atk-at3568_linux_repo = atk-rk3568_linux/rk/rkbin
+@atk-at3568_linux_repo = atk-rk3568_linux/rk/rknn-toolkit2
+@atk-at3568_linux_repo = atk-rk3568_linux/rk/rknpu2
+
+repo @atk-at3568_linux_repo
+  RW+CD = evan

对应 repo list -n创建自己本地的git服务器

evan@evan-X99:~/tools/gitolite-admin$ git commit -m "add @atk-at3568_linux_repo"
[master 5abf05a] add @atk-at3568_linux_repo1 file changed, 71 insertions(+)
evan@evan-X99:~/tools/gitolite-admin$ git push origin master
枚举对象中: 7, 完成.
对象计数中: 100% (7/7), 完成.
使用 48 个线程进行压缩
压缩对象中: 100% (3/3), 完成.
写入对象中: 100% (4/4), 1.03 KiB | 1.03 MiB/s, 完成.
总共 4(差异 0),复用 0(差异 0),包复用 0
remote: 已初始化空的 Git 仓库于 /home/git/repositories/atk-rk3568_linux/android/rk/platform/system/rk_tee_user.git/
remote: 已初始化空的 Git 仓库于 /home/git/repositories/atk-rk3568_linux/android/rk/u-boot.git/
remote: 已初始化空的 Git 仓库于 /home/git/repositories/atk-rk3568_linux/linux/alientek/qt_demo.git/
...
...
remote: 已初始化空的 Git 仓库于 /home/git/repositories/atk-rk3568_linux/rk/rkbin.git/
remote: 已初始化空的 Git 仓库于 /home/git/repositories/atk-rk3568_linux/rk/rknn-toolkit2.git/
remote: 已初始化空的 Git 仓库于 /home/git/repositories/atk-rk3568_linux/rk/rknpu2.git/
To 127.0.0.1:gitolite-admin04b1df0..5abf05a  master -> master

转移.repo

atk的仓库是深度为1的浅仓库, 无法使用git push --all直接推送。
需要逐个将仓库原来的.git删除, 从新创建提交和推送。

获取路径和项目

evan@evan-X99:~/SRC/atk$ .repo/repo/repo forall -c 'echo $REPO_PATH' > path.txt
evan@evan-X99:~/SRC/atk$ .repo/repo/repo forall -c 'echo $REPO_PROJECT' > project.txt

通过$REPO_PATH进入到每个目录,删除原来的.git然后从新初始化.git并将其推送到本地对应的$REPO_PROJECT的远程仓库


创建和推送脚本

你的脚本已经基本实现了所需的功能,但可以进行一些优化以提高可读性和健壮性。以下是一些改进建议:

  1. 错误处理:增加更多的错误处理,确保每一步操作都成功。
  2. 日志记录:添加日志记录,以便在出现问题时更容易调试。
  3. 使用函数:将重复的代码封装到函数中,使脚本更简洁。
  4. 避免硬编码:将一些常量提取出来,便于修改。

以下是优化后的脚本:

#!/bin/bash# 常量定义
REP_URL="git@127.0.0.1:atk-rk3568_linux"
LOG_FILE="script.log"# 日志函数
log() {echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}# 检查文件是否存在
check_files() {if [ ! -f "$1" ] || [ ! -f "$2" ]; thenlog "错误:找不到文件 $1$2"exit 1fi
}# 初始化并推送 Git 仓库
init_and_push() {local path="$1"local project="$2"local src_dir="$3"# 进入目录cd "$src_dir/$path" || { log "无法进入目录 $src_dir/$path"; return; }# 删除 .git 目录(如果存在)if [ -d ".git" ]; thenrm -rf .gitfi# 初始化 Git 仓库git init || { log "初始化 Git 仓库失败: $path"; return; }# 添加所有文件git add . || { log "添加文件失败: $path"; return; }# 提交更改git commit -m "first commit" || { log "提交失败: $path"; return; }# 添加远程仓库git remote add origin "$REP_URL/$project" || { log "添加远程仓库失败: $path"; return; }# 推送至远程仓库git push origin master || { log "推送失败: $path"; return; }log "成功处理: $path : $project"
}# 主逻辑
main() {# 参数检查if [ $# -ne 2 ]; thenecho "用法: $0 <DIR> <SRC_DIR>"exit 1fi# 获取参数DIR="$1"SRC_DIR="$2"# 文件路径path_file="$DIR/path.txt"project_file="$DIR/project.txt"# 检查文件是否存在check_files "$path_file" "$project_file"# 打开文件并逐行读取{while IFS= read -r path_line && IFS= read -r project_line <&3; do# 处理每一行init_and_push "$path_line" "$project_line" "$SRC_DIR"echo "==================================="done < "$path_file" 3< "$project_file"} 3<&-  # 关闭文件描述符3# 检查文件行数是否一致if [ "$(wc -l < "$path_file")" -ne "$(wc -l < "$project_file")" ]; thenlog "警告:$path_file$project_file 的行数不一致。"fi
}# 调用主逻辑
main "$@"

解释:

  1. 日志函数log 函数用于记录日志信息,并将日志输出到控制台和日志文件 script.log 中。
  2. 检查文件函数check_files 函数用于检查两个文件是否存在。
  3. 初始化并推送 Git 仓库init_and_push 函数封装了初始化 Git 仓库、添加文件、提交更改、添加远程仓库和推送的操作。
  4. 主逻辑main 函数是脚本的主逻辑部分,包括参数检查、文件检查、逐行读取和处理每一对路径和项目。

使用说明:

  1. 将上述代码保存到一个文件中,比如命名为 process_paths.sh
  2. 确保 path.txtproject.txt 文件存在于指定的目录下。
  3. 给脚本执行权限:chmod +x process_paths.sh
  4. 运行脚本:./process_paths.sh /path/to/dir /path/to/src_dir

这样,脚本会逐行读取 path.txtproject.txt 文件,并同步处理每一对路径和项目。同时,日志记录功能可以帮助你更好地跟踪脚本的执行情况。


创建中心仓库

evan@evan-X99:~/tools/gitolite-admin$ git diff
diff --git a/conf/gitolite.conf b/conf/gitolite.conf
index 6d44180..4d6ce0e 100644
--- a/conf/gitolite.conf
+++ b/conf/gitolite.conf
@@ -72,5 +72,7 @@ repo testing@atk-at3568_linux_repo = atk-rk3568_linux/rk/rknn-toolkit2@atk-at3568_linux_repo = atk-rk3568_linux/rk/rknpu2+@atk-at3568_linux_repo = atk-rk3568_linux/manifests
+repo @atk-at3568_linux_repoRW+CD = evan

将atk下的manifests推动到刚刚新建的仓库

evan@evan-X99:~$ git clone /home/evan/SRC/atk/.repo/manifests.git
正克隆到 'manifests'...
remote: 枚举对象中: 14, 完成.
remote: 对象计数中: 100% (14/14), 完成.
remote: 压缩对象中: 100% (12/12), 完成.
remote: 总共 14(差异 3),复用 0(差异 0),包复用 0
接收对象中: 100% (14/14), 4.71 KiB | 4.71 MiB/s, 完成.
处理 delta 中: 100% (3/3), 完成.
evan@evan-X99:~$ cd manifests/
evan@evan-X99:~/manifests$ rm .git/ -rf
evan@evan-X99:~/manifests$ git init
已初始化空的 Git 仓库于 /home/evan/manifests/.git/
evan@evan-X99:~/manifests$ git add .
evan@evan-X99:~/manifests$ git commit -m "first commit"
[master (根提交) 3a3d45c] first commit9 files changed, 386 insertions(+)create mode 100755 common/yocto.xmlcreate mode 100755 include/rk356x_doc.xmlcreate mode 120000 rk3568_linux_release.xmlcreate mode 100644 rk356x_linux/ATK-RK3568_Linux_SDK_Note.mdcreate mode 100644 rk356x_linux/atk-rk3568_linux_alpha_v1.0.xmlcreate mode 100644 rk356x_linux/atk-rk3568_linux_release_v1.0_20230620.xmlcreate mode 100644 rk356x_linux/atk-rk3568_linux_release_v1.1_20230901.xmlcreate mode 100644 rk356x_linux/atk-rk3568_linux_release_v1.2_20240129.xmlcreate mode 100644 rk356x_linux/rk356x_linux_release_v1.3.0_20220620.xml
evan@evan-X99:~/manifests$ git remote -v
evan@evan-X99:~/manifests$ git remote add origin git@127.0.0.1:atk-rk3568_linux/manifests
evan@evan-X99:~/manifests$ git push origin master
枚举对象中: 14, 完成.
对象计数中: 100% (14/14), 完成.
使用 48 个线程进行压缩
压缩对象中: 100% (12/12), 完成.
写入对象中: 100% (14/14), 4.64 KiB | 2.32 MiB/s, 完成.
总共 14(差异 3),复用 0(差异 0),包复用 0
To 127.0.0.1:atk-rk3568_linux/manifests* [new branch]      master -> master

拉取

  1. 安装repo命令
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
chmod +x repo
sudo mv repo /usr/bin/
echo "export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'" >> ~/.bashrc
  1. 新建git-repo仓库
evan@evan-X99:~/tools/gitolite-admin$ git diff
diff --git a/conf/gitolite.conf b/conf/gitolite.conf
index 4d6ce0e..4d74d8b 100644
--- a/conf/gitolite.conf
+++ b/conf/gitolite.conf
@@ -4,6 +4,9 @@ repo gitolite-adminrepo testingRW+     =   @all+repo git-repo
+    RW+     =   evan
+@atk-at3568_linux_repo = atk-rk3568_linux/android/rk/platform/system/rk_tee_user@atk-at3568_linux_repo = atk-rk3568_linux/android/rk/u-boot@atk-at3568_linux_repo = atk-rk3568_linux/linux/alientek/qt_demo
  1. 克隆git-repo镜像到本地git服务器
evan@evan-X99:~/tools$ git clone --mirror https://mirrors.tuna.tsinghua.edu.cn/git/git-repo
evan@evan-X99:~/tools$ cd git-repo.git/
evan@evan-X99:~/tools/git-repo.git$ git remote add gitolite git@127.0.0.1:git-repo
evan@evan-X99:~/tools/git-repo.git$ git push gitolite --all
evan@evan-X99:~/tools/git-repo.git$ git push gitolite --tags
  1. 修改中心仓库配置

    1. 指定同步分支为master(前文脚本自动化推送仓库, 默认推送到了master分支)
    2. 删除depth选项
  2. 执行命令

evan@evan-X99:~/work$ repo init -u git@127.0.0.1:atk-rk3568_linux/manifests.git -b master -m rk3568_linux_release.xml --repo-url=git@127.0.0.1:git-repo.git --no-repo-verify
evan@evan-X99:~/work$ repo sync -j10
evan@evan-X99:~/work$ repo start master --all

新增dl仓库

dl/包也一起增加到git服务器做备份下载

evan@evan-X99:~/work$ tar xzf ~/swap-x99/dl.tgz -C buildroot/
evan@evan-X99:~/work$ cd buildroot
evan@evan-X99:~/work/buildroot$ git add -f dl/
evan@evan-X99:~/work/buildroot$ git commit -m "add dl/"
evan@evan-X99:~/work/buildroot$ git push origin master

相关文章:

repo仓库转移到自己本地的git服务器

前提条件&#xff1a;搭建好gitolite 以转移正点原子rk3568_linux工程为例子&#xff0c;将其转移到自己的git服务器。 获取完整repo仓库 将正点原子epo仓库sync出来 evanevan-X99:~/SRC/atk$ .repo/repo/repo sync -l -j10 evanevan-X99:~/SRC/atk$ .repo/repo/repo list -n…...

微服务即时通讯系统的实现(服务端)----(2)

目录 1. 语音识别子服务的实现1.1 功能设计1.2 模块划分1.3 模块功能示意图1.4 接口的实现 2. 文件存储子服务的实现2.1 功能设计2.2 模块划分2.3 模块功能示意图2.4 接口的实现 3. 用户管理子服务的实现3.1 功能设计3.2 模块划分3.3 功能模块示意图3.4 数据管理3.4.1 关系数据…...

人工智能-深度学习-神经网络-激活函数

激活函数通过引入非线性来增强神经网络的表达能力&#xff0c;对于解决线性模型的局限性至关重要。由于反向传播算法(BP)用于更新网络参数&#xff0c;因此激活函数必须是可微的&#xff0c;也就是说能够求导的。 满足激活函数的条件 1.可微分&#xff0c;也就是可求导 激活函…...

vue3+ts+uniapp微信小程序顶部导航栏

这是colorui改的&#xff0c;不用就不用看啦 color-ui(https://docs.xzeu.com/#/) 新建component文件夹创建topNavigation.vue <template><view><view class"cu-custom" :style"height: CustomBar px"><view class"cu-bar…...

IAR中编译下载未下载问题

第一张图片是正常下载&#xff0c;第二张未正常下载。经过查看download选项发现 启用了 suppress download &#xff08;禁用下载)...

springboot(20)(删除文章分类。获取、更新、删除文章详细)(Validation分组校验)

目录 一、删除文章分类功能。 &#xff08;1&#xff09;接口文档。 1、请求路径、请求参数。 2、请求参数。 3、响应数据。 &#xff08;2&#xff09;实现思路与代码书写。 1、controller层。 2、service接口业务层。 3、serviceImpl实现类。 4、mapper层。 5、后端接口测试。…...

英语系统语法书面记载:高级语法 8 的状语从句

在英语高级语法中&#xff0c;状语从句是一种用来修饰动词、形容词、副词或整个句子的从句&#xff0c;它提供有关时间、地点、原因、条件、方式、让步等信息。状语从句通常由特定的连词引导。以下是常见的几种状语从句类型及其用法&#xff1a; 1. 时间状语从句 (Adverbial Cl…...

C语言:深入理解指针(1)

一.内存和地址 在讲内存和地址之前&#xff0c;我们想有个生活中的案例&#xff1a; 假设有一栋宿舍楼&#xff0c;把你放在楼里&#xff0c;楼上有100个房间&#xff0c;但是房间没有编号&#xff0c;你的一个朋友来找你玩&#xff0c;如果想找到你&#xff0c;就得挨个房子去…...

priority_queue--优先队列

一、认识优先队列 priority_queue&#xff08;优先队列&#xff09;是 C 标准模板库&#xff08;STL&#xff09;中的一个容器适配器。它的底层实现通常是用堆&#xff08;一般是二叉堆&#xff09;来实现的。优先队列中的元素按照一定的优先级顺序进行排列&#xff0c;在队首的…...

Paper -- 建筑物高度估计 -- 基于深度学习、图像处理和自动地理空间分析的街景图像建筑高度估算

论文题目: Building height estimation from street-view imagery using deep learning, image processing and automated geospatial analysis 中文题目: 基于深度学习、图像处理和自动地理空间分析的街景图像建筑高度估算 作者: Ala’a Al-Habashna, Ryan Murdoch 作者单位: …...

开发一套ERP 第八弹 RUst 插入数据

更全面的报错,方便检查错误在哪里,现代高级语言越来越智能 还是得看下原文档怎么操作的 src 目录为crate 的根目录 想在crate 中模块相互引入需要在 main 中声明,各个模块,然后才能在各个模块中相互引入和使用 原始工程引入,避免直接使用 lib.rs 回合cargo 中的一些 工程管理出…...

回退用 git revert 还是 git reset?

git revert 会生成一个新的 commit 来记录此次操作&#xff1b;git reset 是把 HEAD 指针向前挪动一次&#xff0c;会减少一个 commit。 回退用 git revert 回退还是用 git reset&#xff0c;核心就一点&#xff1a; 是否需要记录这次回退。 如果需要记录这次回退&#xff0c…...

【docker】多阶段构建与基础构建,及企业案例展示

基础构建与多阶段构建对比 基础构建&#xff08;单阶段构建&#xff09; 在基础构建中&#xff0c;所有构建过程和最终的应用程序都在同一个镜像中进行&#xff0c;构建工具和最终应用程序都会在最终镜像中。 这样构建镜像时会包含所有的构建工具和依赖&#xff0c;因此最终镜…...

基于链表的基础笔试/面试题

1. 反转链表 问题描述&#xff1a;反转一个单向链表。 示例&#xff1a; 输入&#xff1a;1 → 2 → 3 → 4 → 5 输出&#xff1a;5 → 4 → 3 → 2 → 1 class ListNode {int val;ListNode next;ListNode(int x) {val x;} }public class LinkedList {public ListNode …...

SARIMA 模型Matlab代码

% 导入数据 data readtable(data.xlsx); % 假设数据在第一列 y data{:, 1}; % 获取第一列数据% 划分训练集和测试集&#xff0c;80% 训练&#xff0c;20% 测试 trainSize floor(0.8 * length(y)); trainData y(1:trainSize); testData y(trainSize1:end);% 创建时间序列…...

第八课 Unity编辑器创建的资源优化_特效篇(Particle System)详解

无论是CPU还是GPU&#xff0c;粒子系统对其的影响面都是不容小觑的。随着项目的重度化和3A化&#xff0c;玩家的口味变挑剔了、游戏玩法复杂度变高了、画面的特效表现变复杂了......所以我们还是更加谨慎地对待粒子系统。 特效&#xff08;Particle System&#xff09; 游戏效…...

Oracle对比表与表之间的结构

自己首先想到的就是,navicat有提供结构同步 但是有些时候情况不一样,比如我遇到的是连接不同,而且是互相同步,以最多的列的那个表为样 没有说一个固定的源 那么还可以通过导出表结构去另一个库中执行看是否报错,以此来判断结构的不同 但是我感觉有点儿麻烦 最后想到通过sql语…...

基于JSP+MySQL的网上招聘系统的设计与实现

摘要 在这样一个经济飞速发展的时代&#xff0c;人们的生存与生活问题已成为当代社会需要关注的一个焦点。对于一个刚刚 踏入社会的年轻人来说&#xff0c;他对就业市场和形势了解的不够详细&#xff0c;同时对自己的职业规划也很模糊&#xff0c;这就导致大量的 时间被花费在…...

【Linux】进程地址空间(虚拟地址vs物理地址vs页表)

Linux 进程概念补充【Linux】 进程是什么&#xff08;不熟悉的兄弟可以看看&#xff09;。 1. C/C内存分布图 对于有c/c基础的同学相信对上面的图片并不陌生&#xff0c;实际上其描述的并不是正真的物理内存&#xff0c;而是虚拟内存&#xff0c;我们把它叫做进程地址空间 。 2…...

pytorch 融合 fuse 学习笔记

目录 fuse_lora 作用是什么 fuse_modules源码解读 fuse_lora 作用是什么 在深度学习模型微调场景下&#xff08;与 LoRA 相关&#xff09; 参数融合功能 在使用 LoRA&#xff08;Low - Rank Adaptation&#xff09;对预训练模型进行微调后&#xff0c;fuse_lora函数的主要作…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...