web-dev-qa-db-ja.com

「リダイレクト」という警告は実際にはどういう意味ですか?

プロジェクトをGitプルすると、次のようなメッセージが表示されることがあります。

"warning: redirecting to <url>"

私はそれが何を意味するかを検索してみましたが、私は何も役に立たないと思います。それは何ですか?

17
Makogan
warning: redirecting to

これはgit://またはhttp://で始まるGitリポジトリURLの典型ですが、サーバーレベルでhttps://にリダイレクトされます(より安全で、認証が可能です)。

これは 1を永続的に移動する を使用してサーバーレベルで(- この1つでは として)設定されます。

# enforce https
location / {
return 301 https://$server_name$request_uri;
}
10
VonC

リモートを確認してください

git remote -v

おそらくあなたのリモートは https://server/../project であり、。githttps://server/../project.git

9
Dmitry

警告の意味

他の回答で説明したように、保存したURLとサーバーが使用するURLにはわずかな違いがあります。 「わずか」はそれが存在することを意味しますが、自動的に修正できるため、Gitはエラーではなく警告を出します。

警告を取り除く方法:手動で...

それを取り除くには、使用しているURLを更新して、正しいURLと一致するようにします。手動で行う場合は、コマンドを使用する必要があります

git remote set-url <remote_name> <correct_remote_path>

ここで、remote_nameは通常Originであり、git remoteから取得され、correct_remote_pathは警告によって示されるものです。

...そしてBashスクリプトを使用します。バリエーション1、安全だが部分的に手動

警告を自動的にチェックする小さな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を見つけます。
  • 次に、正しいURLを取得します。私はそれを見つける直接の方法を見つけていないので、これは私がやっていることです:git fetch--dry-runオプションを付けて実行します(ドライランは何もしないので、実際には何もフェッチされません。これは、何も変更したくない場合は、通常、フェッチの実行を回避する理由はありません)。警告がある場合、GitはそれをSTDERRに出力します。それをキャプチャするには、 プロセス置換 を使用してから、AWK(通常はどのシステムでも使用可能)でメッセージを解析し、4番目のWordを取得します。 URLにスペースが含まれている場合、この部分は失敗すると思いますが、スペースが含まれていてはいけないので、もっと堅牢にする必要はありません。
  • この時点で、警告が見つかったかどうか(正しいURLと共に)がチェックされます。見つからなかった場合、何もする必要がないため、メッセージを出力して終了します。
  • 正しいURLが見つかった場合は、古いURLと新しいURLの両方を示すメッセージを出力し、変更を適用するために実行する必要があるコマンドを出力します。

バリアント2、安全ではないが完全自動

私のスクリプトを信頼していて、コマンドを実行したい場合は、単に出力するのではなく、次のバリアントを使用できます。

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[@]}"で実行します。

すべてのGitリポジトリでスクリプトを実行する方法

これまでのところ、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を含むディレクトリを検索することによって(ファイルとディレクトリの両方として:通常はディレクトリですが、サブモジュールのファイルです)。次に、各リポジトリーの内部に移動し、関数を呼び出して戻ります。