组里的项目之间存在依赖关系,由于历史原因,并未使用submodule维护项目的依赖,日常开发需要手动依次更新仓库代码,否则可能碰到各种奇怪的问题。

参考网上的资料,结构基本都类似,本地手动维护一份仓库目录:git_list.txt,编写脚本遍历目录,一次执行更新,以后开工前先执行下脚本

linux

create new file: batch_pull.sh

#!/bin/bash

echo "============ 更新仓库 ==================="

# 检查 git_list.txt 是否存在
if [ ! -f "git_list.txt" ]; then
  echo "git_list.txt 文件不存在!请创建并添加要拉取的 git 仓库 URL。"
  exit 1
else
  echo "============ 检测到了 git 仓库清单文件 ===="
fi

# 逐行读取 git_list.txt 中的 URL,并执行拉取操作
while read -r url; do
  if [ -d "$url" ]; then
    cd "$url" || continue
    git pull
    cd ..
    echo "Pull $url 完成!"
    echo "========================================"
  else
    echo "目录 $url 不存在,跳过拉取。"
  fi
done < "git_list.txt"

windows

create a new file: batch_pull.bat

@echo off
chcp 65001 > nul
rem 进入脚本所在目录
cd /d "%~dp0"

rem 检查 git_list.txt 是否存在
if not exist "git_list.txt" (
  echo git_list.txt 文件不存在!请创建并添加要拉取的 git 仓库 URL。
  exit /b 1
) else (
  echo ============ 检测到了 git 仓库清单文件 ====
)

rem 逐行读取 git_list.txt 中的 URL,并执行拉取操作
for /f %%i in (git_list.txt) do (
  if exist "%%i" (
    pushd "%%i"
    git pull
    popd
    echo Pull %%i 完成!
    echo ========================================
  ) else (
    echo 目录 %%i 不存在,跳过拉取。
  )
)

历史遗留问题

顺带处理重装系统以后碰到的git文件夹权限文件:Fatal error “unsafe repository (’/home/repon’ is owned by someone else)”

网上建议的做法大多来源自stack overflow:

  1. 仓库目录添加信任: git config --global --add safe.directory /home/repon
  2. 手动修改配置文件.gitconfig,指定目录添加信任
[safe]
    directory = /home/repon

上面的方式处理以后,仓库更新是正常了,每次执行git pull控制台都有很多警告信息,提示用户所有者错误

台式机重装系统

开发的机器,太久没有重装系统,系统盘垃圾文件爆炸,没辙,抽空重装了一波系统,再次碰到这个权限的问题,以前的脚本跑不通,修改的权限不完整

用上新的方案,直接添加*,这样git会自动信任所有目录

git config --global --add safe.directory "*"

不知道是用户权限的问题,还是大家没习惯windows平台其实也有类似chown的命令,修改文件夹所有者,当然如果你的目录不多,手动修改所有者也行,但是这台工作电脑添加了域信息,不知道是公司部署的域存在异常,还是本地系统设置存在异常,用户清单中,找不到登录所用的用户,最后还是通过命令行处理的。

管理员权限,执行powershell脚本change_ower.ps1,记得调整脚本文件编码为gbk,中文操作系统,这样才不会乱码

# 获取当前用户的用户名
$currentUserName = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name

# 设置 PowerShell 的字符编码为 UTF-8
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

# 要更改所有者的根目录路径
$rootDirectory = "G:\workspace"  # 替换为实际的目录路径

# 递归遍历目录并更改文件和文件夹的所有者
Get-ChildItem -Path $rootDirectory -Recurse | ForEach-Object {
    $itemPath = $_.FullName

    # 检查是文件还是文件夹
    if ($_ -is [System.IO.DirectoryInfo]) {
        # 如果是文件夹,使用 icacls 更改所有者权限
        $icaclsResult = icacls $itemPath /setowner "$currentUserName" 2>&1
        if ($LASTEXITCODE -eq 0) {
            Write-Host "已更改文件夹 $itemPath 的所有者为 $currentUserName"
        } else {
            Write-Host "无法更改文件夹 $itemPath 的所有者。错误信息: $icaclsResult"
        }
    } else {
        # 如果是文件,使用 icacls 更改所有者权限
        $takeownResult = icacls $itemPath /setowner "$currentUserName" 2>&1
        if ($LASTEXITCODE -eq 0) {
            # Write-Host "已更改文件 $itemPath 的所有者为 $currentUserName"
        } else {
            Write-Host "无法更改文件 $itemPath 的所有者。错误信息: $takeownResult"
        }
    }
}

不出意外的还是出现了预料之外的情况,脚本执行输出的中文信息乱,尝试设置控制台的字符编码,调整脚本编码,输出的都是乱码,脑子那会大概率不清醒了,试着启用 控制面板-区域-语言设置的 beta 功能,全局开启 Unicode 编码,脚本执行是正常了,好几个开发软件都无法正常工作,回头梳理资料才想起来,调整脚本文件的编码,设置为 gbk

资料