チームのプロジェクト間に依存関係があり、歴史的な理由から 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
から提供されています。
- リポジトリディレクトリに信頼を追加:
git config --global --add safe.directory /home/repon
.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
に設定する必要があることを思い出した。