我注意到有时当我git pull一个项目时,会有一条消息说:
"warning: redirecting to <url>"
我尝试搜索它的含义,但没发现有用的东西。什么事?
答案 0 :(得分:8)
正如其他答案所解释的那样,您保存的URL与服务器使用的URL略有不同。 “轻微”表示它在那里,但是可以自动修复,因此Git不会给出错误,而是发出警告。
要摆脱它,您可以更新您使用的URL,确保它与正确的URL匹配。如果要手动执行操作,则必须使用命令
git remote set-url <remote_name> <correct_remote_path>
其中remote_name
通常是origin
,并且来自git remote
,而correct_remote_path
是警告所示的那个。
我编写了一个小的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 $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
}
在复制脚本并将其粘贴到您的外壳程序(仅一次)之后,只需转到您发现问题的Git目录,然后输入check_git_redirection_warning
。检查生成的命令,如果有意义(应该,但是为了安全起见!),只需将其复制并粘贴到外壳中即可。
git remote
来获取默认遥控器的名称(通常为origin
)git remote get-url $remote_name
来查找当前配置的URL,这是(或可能是)错误的。git fetch
选项运行--dry-run
(dryrun不会执行任何操作,因此实际上不会获取任何内容。您不需要更改任何内容,尽管通常没有理由避免运行fetch)。如果有警告,Git会将其打印到STDERR。要捕获它,我使用process substitution,然后用AWK(通常在任何系统上都可用)解析该消息并得到第4个字。我认为,如果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
}
它与第一个非常相似,但是代替打印命令,it saves all the parts into an array名为mycmd
,然后使用"${mycmd[@]}"
运行它。
到目前为止,我们已经看到了如何在一个仓库中修复警告。如果您有很多,并且想要全部更新怎么办?您可以在此处使用此其他脚本:
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的目录(既是文件又是目录:通常是目录,但是是子模块的文件)。然后,对于每个回购,它将进入其中,调用该函数,然后返回。
答案 1 :(得分:6)
答案 2 :(得分:2)
warning: redirecting to
这是典型的以git://
或http://
开头的Git存储库URL,但在服务器级别重定向到https://
(这更安全,并允许进行身份验证)
这是在服务器级别(如in this one)和301 Moved Permanently设置的。
# enforce https location / { return 301 https://$server_name$request_uri; }
答案 3 :(得分:0)
如果您是从www.github.com克隆的,它会给您该消息,因为它更喜欢github.com(不提供www)。今天发生在我身上。
答案 4 :(得分:0)
就我而言,唯一的区别是GitHub警告返回的URL地址上的斜杠/
。
在我的配置文件中添加斜杠使警告消失。
奇怪的是,我正在做一个git fetch --all
,只有my
远程需要最后一个斜杠,而其他(origin
和维护者)的GitHub存储库则不需要它。相当混乱。
答案 5 :(得分:-1)
如果您在克隆时关闭 .git
扩展并且您的遥控器没有设置它,也会发生这种情况。例如git clone https://github.com/myuser/myrepo
。而不是https://github.com/myuser/myrepo.git