警告 "redirecting to" 到底是什么意思?

What does the warning "redirecting to" actually mean?

我注意到有时当我 git 拉一个项目时,有一条消息说:

"warning: redirecting to <url>"

我尝试搜索它的含义,但没有找到有用的信息。这是什么?

warning: redirecting to

这是典型的 Git 存储库 URL 以 git://http:// 开头,但在服务器级别被重定向到 https://(哪个更安全,并允许身份验证)

这是在服务器级别设置的(如 in this one) with a 301 Moved Permanently

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

检查你的远程:

git remote -v

可能,您的远程是 https://server/../project 并且不以 .git (https://server/.. /project.git).

警告的含义

正如其他答案所解释的那样,您保存的 URL 与服务器使用的 URL 之间存在细微差别。 "Slight" 表示它在那里,但它可以自动修复,所以 Git 不会给出错误,而是警告。

如何消除警告:手动...

要删除它,您可以更新您正在使用的 URL,确保它与正确的匹配。如果你想手动做,你必须使用命令

git remote set-url <remote_name> <correct_remote_path>

其中 remote_name 通常是 origin,来自 git remotecorrect_remote_path 是警告中显示的那个。

...并带有 Bash 脚本。变体 1,安全但部分手动

我写了一个小 Bash 脚本来自动检查该警告。它会告诉你是否无事可做,或者它会打印用于删除警告的命令。它不会 运行 自动,只是为了安全。

我选择使用一个函数,您可以直接将其复制并粘贴到您的 shell,这样您就不必担心将其保存到文件、检查文件路径以及然后删除它。在这里:

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 }'))";
    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
}

如何运行它

复制脚本并将其粘贴到 shell 后(只需要一次),只需转到出现问题的 Git 目录并输入 check_git_redirection_warning .检查生成的命令,如果它有意义(它应该,但我们要安全!),只需将其复制并粘贴到 shell.

工作原理

  • 首先,运行s git remote获取默认遥控器的名称(通常origin
  • 然后它找到当前配置的 URL,这是(或可能)错误的,运行宁 git remote get-url $remote_name
  • 然后得到正确的URL。我还没有找到找到它的直接方法,所以这就是我所做的:我 运行 git fetch 带有 --dry-run 选项(干运行 什么都不做,所以实际上没有获取任何内容。如果您不想更改任何内容,这会有所帮助,尽管通常没有理由避免 运行ning 获取)。如果有警告,Git 会将其打印到 STDERR。为了捕获它,我使用 process substitution,然后我使用 AWK(通常在任何系统上都可用)解析消息并获取第 4 个字。我认为如果 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 }'))"
    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
}

工作原理

它与第一个非常相似,但不是打印命令,it saves all the parts into an array 调用了 mycmd 然后 运行 用 "${mycmd[@]}" 调用了它。

如何 运行 所有 Git 存储库中的脚本

到目前为止,我们已经了解了如何修复一个存储库中的警告。如果您有很多,并且想全部更新怎么办?您可以在此处使用其他脚本:

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

finds all the repositories 通过查找包含 .git 的目录(作为文件和目录:它通常是目录,但它是子模块的文件)。然后,对于每个 repo,它都会进入其中,调用函数,然后返回。

如果您从 www.github.com 克隆,它会给您该消息,因为它更喜欢 github.com(无 www)。今天发生在我身上。

在我的例子中,唯一的区别是来自 GitHub 的警告返回的 URL 地址上的尾部斜杠 /

将尾部斜杠添加到我的配置文件后警告消失了。

奇怪的是,我正在做一个 git fetch --all 并且只有 my 远程需要最后的斜杠,另一个(origin 和维护者的)GitHub 回购没有需要它。相当混乱。

如果您在克隆时关闭 .git 扩展并且您的遥控器没有设置它,也会发生这种情况。例如 git clone https://github.com/myuser/myrepo。而不是 https://github.com/myuser/myrepo.git

就我而言,我使用的是 azure git 并在服务器 url 中使用 git 克隆命令发送 PAT。它已经包含在 http.extraHeader="etc" 中。这给出了这个警告。当我从 url 中删除 PAT 时,警告消失了。