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

前提条件:搭建好gitolite

以转移正点原子rk3568_linux工程为例子,将其转移到自己的git服务器。

获取完整repo仓库

将正点原子epo仓库sync出来

shell 复制代码
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一样:

diff 复制代码
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-admin

 repo testing
     RW+     =   @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服务器

shell 复制代码
evan@evan-X99:~/tools/gitolite-admin$ git commit -m "add @atk-at3568_linux_repo"
[master 5abf05a] add @atk-at3568_linux_repo
 1 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-admin
   04b1df0..5abf05a  master -> master

转移.repo

atk的仓库是深度为1的浅仓库, 无法使用git push --all直接推送。

需要逐个将仓库原来的.git删除, 从新创建提交和推送。

获取路径和项目

shell 复制代码
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. 避免硬编码:将一些常量提取出来,便于修改。

以下是优化后的脚本:

bash 复制代码
#!/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" ]; then
    log "错误:找不到文件 $1 或 $2"
    exit 1
  fi
}

# 初始化并推送 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" ]; then
    rm -rf .git
  fi

  # 初始化 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 ]; then
    echo "用法: $0 <DIR> <SRC_DIR>"
    exit 1
  fi

  # 获取参数
  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")" ]; then
    log "警告:$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 文件,并同步处理每一对路径和项目。同时,日志记录功能可以帮助你更好地跟踪脚本的执行情况。


创建中心仓库

diff 复制代码
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_repo
   RW+CD = evan

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

shell 复制代码
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 commit
 9 files changed, 386 insertions(+)
 create mode 100755 common/yocto.xml
 create mode 100755 include/rk356x_doc.xml
 create mode 120000 rk3568_linux_release.xml
 create mode 100644 rk356x_linux/ATK-RK3568_Linux_SDK_Note.md
 create mode 100644 rk356x_linux/atk-rk3568_linux_alpha_v1.0.xml
 create mode 100644 rk356x_linux/atk-rk3568_linux_release_v1.0_20230620.xml
 create mode 100644 rk356x_linux/atk-rk3568_linux_release_v1.1_20230901.xml
 create mode 100644 rk356x_linux/atk-rk3568_linux_release_v1.2_20240129.xml
 create 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命令
shell 复制代码
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仓库
diff 复制代码
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-admin
 repo testing
     RW+     =   @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服务器
shell 复制代码
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. 执行命令

shell 复制代码
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服务器做备份下载

shell 复制代码
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
相关推荐
laimaxgg几秒前
Linux关于华为云开放端口号后连接失败问题解决
linux·运维·服务器·网络·tcp/ip·华为云
卷卷的小趴菜学编程38 分钟前
c++之List容器的模拟实现
服务器·c语言·开发语言·数据结构·c++·算法·list
艾杰Hydra41 分钟前
LInux配置PXE 服务器
linux·运维·服务器
多恩Stone1 小时前
【ubuntu 连接显示器无法显示】可以通过 ssh 连接 ubuntu 服务器正常使用,但服务器连接显示器没有输出
服务器·ubuntu·计算机外设
牙牙7051 小时前
ansible一键安装nginx二进制版本
服务器·nginx·ansible
AGI学习社3 小时前
2024中国排名前十AI大模型进展、应用案例与发展趋势
linux·服务器·人工智能·华为·llama
加油,旭杏3 小时前
【go语言】变量和常量
服务器·开发语言·golang
wanhengidc3 小时前
网站服务器中的文件被自动删除的原因
运维·服务器
9毫米的幻想4 小时前
【Linux系统】—— 编译器 gcc/g++ 的使用
linux·运维·服务器·c语言·c++
小深ai硬件分享5 小时前
Keras、TensorFlow、PyTorch框架对比及服务器配置揭秘
服务器·人工智能·深度学习