优秀的编程知识分享平台

网站首页 > 技术文章 正文

代码从Bitbucket迁移到Gitlab后,本地代码不重新下载如何更新?

nanyue 2024-08-22 17:36:23 技术文章 6 ℃

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 "所有项目的远程配置已更新."
最近发表
标签列表