ローカルのGitリポジトリと履歴上の遺留権限の問題の一括更新

チームのプロジェクト間に依存関係があり、歴史的な理由から submodule を使用せずにプロジェクトの依存を管理してきました。日常の開発では、リポジトリコードを順番に手動で更新する必要があり、そうでない場合、さまざまな奇妙な問題が発生する可能性があります。

オンラインの情報源を参照して、構造は基本的に同じです。ローカルで git_list.txt というディレクトリを維持し、スクリプトを使用してディレクトリを反復処理し、一度に更新を実行し、その後、作業を開始する前にこのスクリプトを実行します。

Linux

新しいファイルを作成: 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

新しいファイルを作成: 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 %%i のプルが完了しました!
    echo ========================================
  ) else (
    echo ディレクトリ %%i は存在しません。スキップします。
  )
)

過去の遺留問題

再装システム後に発生した git フォルダの権限ファイルに関する問題を解決します:致命的なエラー「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 を実行する際にコンソールに多数の警告メッセージが表示され、所有者に関するエラーを示しています。

デスクトップPCのシステム再インストール

長らくシステムを再インストールしていなかったマシンで、システムディスクにゴミファイルが爆発的に発生し、仕方なく空き時間を利用してシステムを再構築した。再度この権限の問題に遭遇し、以前のスクリプトが動作しない原因は、修正した権限が不完全だったことによるもの。

新しい解決策を採用し、*を追加することで、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年06月02日 20:54
金融ITプログラマーのいじくり回しと日常のつぶやき
Hugo で構築されています。
テーマ StackJimmy によって設計されています。