Bitbucket托管代码超过五人收费,将所有代码仓库转移到私服Gitlab,写了一个批量下载相聚的脚本,发现IntelliJ IDEA重新加载项目比较慢。我的思路,将本地代老的码仓库的remote 地址批处理,同时进行git pull 验证(前提你已经在gitlab添加ssh 密钥)。shell 脚本如下:
#!/bin/bash
# 删除已存在的 projects.txt
if [ -f "projects.txt" ]; then
rm "projects.txt"
fi
# 设置初始分页和空的项目数组
page=1
# shellcheck disable=SC2034
projects=()
# 使用循环来检索所有分页的项目
while true; do
response=$(curl --header "PRIVATE-TOKEN: 自己的token" "gitlab的访问地址/api/v4/projects?membership=true&page=$page")
# 使用 jq 将 SSH URL 添加到项目数组中
project_urls=$(echo "$response" | jq -r '.[].ssh_url_to_repo')
# 如果响应为空,表示没有更多项目分页,退出循环
if [ -z "$project_urls" ]; then
break
fi
# 将每个项目的 SSH URL 写入 projects.txt 文件
for project_url in $project_urls; do
echo "$project_url" >>projects.txt
done
# 增加分页计数
page=$((page + 1))
done
echo "所有项目的 SSH URL 已写入 projects.txt 文件。"
# 读取 projects.txt 文件中的项目 SSH URL
# shellcheck disable=SC2207
project_urls=($(cat projects.txt))
# 创建一个空的数组来存储实际的项目名称
project_names=()
# 提取项目名称并将其添加到数组中
for project_url in "${project_urls[@]}"; do
# 使用 sed 提取项目名称
project_name=$(echo "$project_url" | sed -E 's/.*\/(.+)\.git/\1/')
project_names+=("$project_name")
done
echo "实际的项目名称已提取。"
# 循环处理每个项目
for ((i = 0; i < ${#project_names[@]}; i++)); do
project_name="${project_names[$i]}"
project_url="${project_urls[$i]}"
echo "处理项目: $project_name"
# 进入项目文件夹,如果文件夹不存在,则跳过此项目
if [ -d "本地项目目录/$project_name" ]; then
# shellcheck disable=SC2164
cd "本地项目目录/$project_name"
# 检查是否已存在名为 "origin" 的远程仓库
if git remote | grep -q '^origin#39;; then
# 获取当前远程仓库的URL
current_url=$(git remote get-url origin)
# 检查当前URL是否与新的URL不匹配
if [ "$current_url" != "$project_url" ]; then
# 如果不匹配,删除旧的 "origin" 远程仓库
git remote rm origin
else
echo "项目已包含 'origin' 远程仓库,且与新URL匹配,跳过处理: $project_name"
continue
fi
fi
# 设置新的远程仓库URL
git remote add origin "$project_url"
# 手动设置上游分支为 origin/master
git fetch origin
git branch --set-upstream-to=origin/master master
# 显示当前远程仓库配置
git remote -v
# 返回到脚本目录
# shellcheck disable=SC2164
# shellcheck disable=SC2103
cd -
else
echo "项目文件夹不存在,跳过处理: $project_name"
fi
done
echo "所有项目的远程配置已更新。"
@echo off
setlocal enabledelayedexpansion
REM 删除已存在的 projects.txt 和 temp.txt
if exist "projects.txt" (
del "projects.txt"
)
REM 设置项目文件夹路径为变量
set "project_folder=C:\path\to\your\project\folder\"
REM 设置初始分页和空的项目数组
set page=1
set projects=
REM 使用循环来检索所有分页的项目
:loop
REM 打印当前页数
echo 当前是第 %page% 页
curl --header "PRIVATE-TOKEN: 自己的token" "gitlab的访问地址/api/v4/projects?membership=true&page=!page!" > response.json
REM 判断 response.json 是否为空,如果为空则跳出循环
for %%a in (response.json) do (
set "file_size=%%~za"
if !file_size! equ 2 (
del "response.json"
goto :continue_after_loop
)
)
REM 使用 jq 来提取 SSH URL 并将其添加到项目数组中 ssh_url_to_repo or http_url_to_repo
jq -r ".[].ssh_url_to_repo" response.json >> project_urls.txt
REM 增加分页计数
set /a page+=1
del "response.json"
goto :loop
:continue_after_loop
echo "所有项目的 SSH URL 已写入 projects.txt 文件."
REM 以下是循环之后的部分,可以继续执行其他命令
REM 读取 projects.txt 文件中的项目 SSH URL
for /f %%i in (projects.txt) do (
set "project_url=%%i"
echo 项目 URL: !project_url!
REM 从项目 URL 中提取项目名称并过滤掉 .git 后缀
setlocal enabledelayedexpansion
for %%j in ("!project_url!") do (
set "project_name=%%~nxj"
set "project_name=!project_name:.git=!"
echo 项目名称: !project_name!
)
echo 当前项目文件夹: "!project_folder!!project_name!"
REM 进入项目文件夹,如果文件夹不存在,则跳过此项目
if exist "!project_folder!!project_name!" (
pushd "!project_folder!!project_name!"
REM 检查是否已存在名为 "origin" 的远程仓库
git remote | findstr /i /c:"^origin#34; > nul
if %errorlevel% == 0 (
REM 获取当前远程仓库的URL
for /f %%k in ('git remote get-url origin') do (
set "current_url=%%k"
)
REM 检查当前URL是否与新的URL不匹配
if not "!current_url!"=="!project_url!" (
REM 如果不匹配,删除旧的 "origin" 远程仓库
git remote rm origin
) else (
echo "项目已包含 'origin' 远程仓库,且与新URL匹配,跳过处理: !project_name!"
popd
continue
)
)
REM 设置新的远程仓库URL
git remote add origin "!project_url!"
REM 手动设置上游分支为 origin/master
git fetch origin
git branch --set-upstream-to=origin/master master
REM 显示当前远程仓库配置
git remote -v
REM 返回到脚本目录
popd
) else (
echo "项目文件夹不存在,跳过处理: !project_name!"
)
)
echo "所有项目的远程配置已更新."