警告 "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 remote
,correct_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 时,警告消失了。
我注意到有时当我 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 remote
,correct_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 时,警告消失了。