一括でローカルの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フォルダの権限ファイルに関する問題:“unsafe repository (’/home/repon’ is owned by someone else)“という致命的なエラー

オンラインで推奨されている方法は、ほとんどの場合 stack overflow から来ています。

リポジトリディレクトリへの信頼追加:git config --global --add safe.directory /home/repon 手動で設定ファイル.gitconfigを修正し、ディレクトリを追加して信頼を設定する。

[safe]
    directory = /home/repon

処理が終わった後、倉庫のアップデートは正常になりましたが、毎回 git pull を実行すると、コンソールに多くの警告メッセージが表示され、ユーザー権限のエラーを促されています。

デスクトップのOSを入れ替える

開発した機械、あまりにも長い間再インストールしていないのでシステムディスクのゴミファイルが爆発してしまい、どうしようもない。時間を作って再インストールしたらまたこの権限の問題に遭遇し、昔のスクリプトが動かず、修正した権限が不完全だった。

新しいプランを使って、直接*を追加すれば、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"
        }
    }
}

予期せぬ事態が発生し、やはり予想外のことが起きた。スクリプト実行時の中国語情報が文字化けし、コンソールの文字コード設定やスクリプトのエンコーディング調整を試みたが、すべて文字化けした。頭が働いていないのだろうか。試しにコントロールパネル-地域-言語設定のベータ機能を有効にし、グローバルでUnicodeエンコーディングを有効にしたところ、スクリプトは正常に実行されるようになった。しかし、いくつかの開発ソフトウェアが正常に動作しなくなった。後で資料を整理したところ、ようやくスクリプトファイルのエンコーディングをgbkに設定する必要があることに気づいた。

資料

Licensed under CC BY-NC-SA 4.0
最終更新 2025年05月25日 14:10
金融ITプログラマーのいじくり回しと日常のつぶやき
Hugo で構築されています。
テーマ StackJimmy によって設計されています。