警告“重定向到”实际上是什么意思?

时间:2018-10-26 16:04:12

标签: git url warnings pull

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

"warning: redirecting to <url>"

我尝试搜索它的含义,但没发现有用的东西。什么事?

6 个答案:

答案 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脚本。变体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 $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,这是(或可能是)错误的。
  • 然后它将获取正确的URL。我还没有找到找到它的直接方法,所以我要做的是:我使用git fetch选项运行--dry-run(dryrun不会执行任何操作,因此实际上不会获取任何内容。您不需要更改任何内容,尽管通常没有理由避免运行fetch)。如果有警告,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 $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存储库中运行脚本

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

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)

检查您的遥控器

git remote -v

您的遥控器可能是https://server/../project,并且不以 .git https://server/../project.git

结尾

答案 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