일괄 업데이트된 로컬 Git 저장소 및 기존 권한 문제

팀 내 프로젝트들 간에는 의존 관계가 존재하며, 과거의 사유로 인해 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 폴더 권한 파일 관련 오류: “안전하지 않은 저장소 (’/home/repon’은 다른 사용자가 소유하고 있습니다’)” 치명적인 오류

온라인에서 제안하는 방법들은 대부분 스택 오버플로우에서 비롯된 것입니다

저장소 디렉터리에 대한 신뢰 추가: git config --global --add safe.directory /home/repon 수동으로 .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"
        }
    }
}

예상치 못한 상황이 발생했는데, 스크립트 실행 시 출력되는 중국어 정보가 깨져 있었고, 콘솔 문자 인코딩을 설정하고 스크립트 인코딩을 조정했음에도 불구하고 여전히 엉망진창이었다. 머리가 제대로 작동하지 않는 것 같아서, 제어판-지역-언어 설정의 베타 기능을 활성화하고 전역적으로 유니코드 인코딩을 켰더니 스크립트는 정상적으로 실행되었지만 여러 개발 소프트웨어가 제대로 작동하지 않았다. 뒤돌아보니 자료를 정리하다가 스크립트 파일의 인코딩을 gbk로 설정해야 한다는 것을 기억해냈다.

자료

Licensed under CC BY-NC-SA 4.0
마지막 수정: 2025년 05월 25일 14:10
금융 IT 프로그래머의 이것저것 만지작거리기와 일상의 중얼거림
Hugo로 만듦
JimmyStack 테마 사용 중