プロジェクトをGitプルすると、次のようなメッセージが表示されることがあります。
"warning: redirecting to <url>"
私はそれが何を意味するかを検索してみましたが、私は何も役に立たないと思います。それは何ですか?
warning: redirecting to
これはgit://
またはhttp://
で始まるGitリポジトリURLの典型ですが、サーバーレベルでhttps://
にリダイレクトされます(より安全で、認証が可能です)。
これは 1を永続的に移動する を使用してサーバーレベルで(- この1つでは として)設定されます。
# enforce https location / { return 301 https://$server_name$request_uri; }
リモートを確認してください
git remote -v
おそらくあなたのリモートは https://server/../project であり、。git( https://server/../project.git )
他の回答で説明したように、保存したURLとサーバーが使用するURLにはわずかな違いがあります。 「わずか」はそれが存在することを意味しますが、自動的に修正できるため、Gitはエラーではなく警告を出します。
それを取り除くには、使用しているURLを更新して、正しいURLと一致するようにします。手動で行う場合は、コマンドを使用する必要があります
git remote set-url <remote_name> <correct_remote_path>
ここで、remote_name
は通常Origin
であり、git remote
から取得され、correct_remote_path
は警告によって示されるものです。
警告を自動的にチェックする小さなBashスクリプトを作成しました。何もする必要がないかどうか、または警告を削除するために使用するコマンドを出力します。安全のため、自動的には実行されません。
シェルに直接コピーして貼り付けることができる関数を使用することを選択したので、ファイルに保存し、ファイルのパスを確認してから削除することを心配する必要はありません。ここにあります:
function check_git_redirection_warning {
remote_name="$(git remote)";
wrong_remote_path="$(git remote get-url $remote_name)";
correct_remote_path="$(git fetch --dry-run 2> >(awk '/warning: redirecting to/ { print $4}'))";
if [ -z "${correct_remote_path-}" ]; then
printf "The path of the remote '%s' is already correct\n" $remote_name;
else
printf "Command to change the path of remote '%s'\nfrom '%s'\n to '%s'\n" $remote_name $wrong_remote_path $correct_remote_path;
printf "git remote set-url %s %s\n" $remote_name $correct_remote_path;
fi
}
スクリプトをコピーしてシェルに貼り付けたら(必要なのは1回だけ)、問題が発生しているGitディレクトリに移動し、check_git_redirection_warning
と入力します。生成されたコマンドを確認し、それが理にかなっている場合は(安全ですが安全です!)、コピーしてシェルに貼り付けます。
git remote
を実行してデフォルトのリモートの名前を取得します(通常はOrigin
)git remote get-url $remote_name
を実行して、現在構成されているURLが間違っている(または間違っている可能性がある)URLを見つけます。git fetch
を--dry-run
オプションを付けて実行します(ドライランは何もしないので、実際には何もフェッチされません。これは、何も変更したくない場合は、通常、フェッチの実行を回避する理由はありません)。警告がある場合、GitはそれをSTDERRに出力します。それをキャプチャするには、 プロセス置換 を使用してから、AWK(通常はどのシステムでも使用可能)でメッセージを解析し、4番目のWordを取得します。 URLにスペースが含まれている場合、この部分は失敗すると思いますが、スペースが含まれていてはいけないので、もっと堅牢にする必要はありません。私のスクリプトを信頼していて、コマンドを実行したい場合は、単に出力するのではなく、次のバリアントを使用できます。
function remove_git_redirection_warning {
remote_name="$(git remote)"
wrong_remote_path="$(git remote get-url $remote_name)"
correct_remote_path="$(git fetch --dry-run 2> >(awk '/warning: redirecting to/ { print $4}'))"
if [ -z "${correct_remote_path-}" ]; then
printf "The path of the remote '%s' is already correct\n" $remote_name;
else
mycmd=(git remote set-url "$remote_name" "$correct_remote_path")
printf '%s ' "${mycmd[@]}"; printf "\n";
"${mycmd[@]}"
fi
}
これは最初のものと非常に似ていますが、コマンドを出力する代わりに、 すべての部分を配列に保存しますmycmd
と呼ばれ、"${mycmd[@]}"
で実行します。
これまでのところ、1つのリポジトリで警告を修正する方法を見てきました。多数あり、それらをすべて更新したい場合はどうなりますか?ここでこの他のスクリプトを使用できます。
git_directories="$(find . -name ".git" -exec dirname {} \;)"
for git_dir in $git_directories; do
printf "Entering directory %s\n" $git_dir
cd $git_dir
remove_git_redirection_warning
printf "\n"
cd -
done
それは すべてのリポジトリを見つける .gitを含むディレクトリを検索することによって(ファイルとディレクトリの両方として:通常はディレクトリですが、サブモジュールのファイルです)。次に、各リポジトリーの内部に移動し、関数を呼び出して戻ります。