前提条件:搭建好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-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服务器
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
删除, 从新创建提交和推送。
获取路径和项目
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
的远程仓库
创建和推送脚本
你的脚本已经基本实现了所需的功能,但可以进行一些优化以提高可读性和健壮性。以下是一些改进建议:
- 错误处理:增加更多的错误处理,确保每一步操作都成功。
- 日志记录:添加日志记录,以便在出现问题时更容易调试。
- 使用函数:将重复的代码封装到函数中,使脚本更简洁。
- 避免硬编码:将一些常量提取出来,便于修改。
以下是优化后的脚本:
#!/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 "$@"
解释:
- 日志函数:
log
函数用于记录日志信息,并将日志输出到控制台和日志文件script.log
中。 - 检查文件函数:
check_files
函数用于检查两个文件是否存在。 - 初始化并推送 Git 仓库:
init_and_push
函数封装了初始化 Git 仓库、添加文件、提交更改、添加远程仓库和推送的操作。 - 主逻辑:
main
函数是脚本的主逻辑部分,包括参数检查、文件检查、逐行读取和处理每一对路径和项目。
使用说明:
- 将上述代码保存到一个文件中,比如命名为
process_paths.sh
。 - 确保
path.txt
和project.txt
文件存在于指定的目录下。 - 给脚本执行权限:
chmod +x process_paths.sh
- 运行脚本:
./process_paths.sh /path/to/dir /path/to/src_dir
这样,脚本会逐行读取 path.txt
和 project.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_repo
RW+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 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
拉取
- 安装
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
- 新建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-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
- 克隆
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
-
修改中心仓库配置
- 指定同步分支为
master
(前文脚本自动化推送仓库, 默认推送到了master分支) - 删除
depth
选项
- 指定同步分支为
-
执行命令
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