Что на самом деле означает предупреждение "перенаправление на"?

Я заметил, что иногда, когда я git pull проект, появляется сообщение:

"warning: redirecting to <url>"

Я попытался найти, что это значит, но ничего полезного не нашел. Что это?

Может быть, git получил ответ Redirect из репозитория, чтобы проверить другой URL-адрес?

eftshift0 26.10.2018 18:06

Проблема заключалась в том, что в моем случае на локальном .git/config удаленный URL-адрес был установлен на https://gitlab.com/group/subgroup/project, но gitlab перенаправлен на https://gitlab.com/group/subgroup/project.git/. Установка URL-адреса непосредственно на project.git исправила это.

Madjosz 28.02.2019 10:50

При клонировании с www.github.com будет выдано предупреждение о перенаправлении, поскольку он предпочитает github.com без префикса www.

jeesty 25.08.2020 01:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
25
3
20 890
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий
warning: redirecting to

Это типично для URL-адреса репозитория Git, начинающегося с git:// или http://, но который перенаправляется на уровне сервера на https:// (который более безопасен и позволяет аутентификацию).

Это устанавливается на уровне сервера (как в этом) с помощью 301 перемещен навсегда.

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

проверь себя удаленно

git remote -v

вероятно ваш пульт https: //server/../project и не заканчивается на .git (https: //server/../project.git)

Что означает предупреждение

Как объяснялось в других ответах, есть небольшая разница между URL-адресом, который вы сохранили, и тем, который использует сервер. "Незначительный" означает, что это есть, но это может быть исправлено автоматически, поэтому Git выдает не ошибку, а скорее предупреждение.

Как избавиться от предупреждения: вручную ...

Чтобы избавиться от него, вы можете обновить 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
}

Как запустить это

После того, как вы скопировали сценарий и вставили его в свою оболочку (требуется только один раз), просто перейдите в каталог Git, где вы видите проблему, и введите check_git_redirection_warning. Проверьте сгенерированную команду и, если она имеет смысл (должна, но будьте осторожны!), Просто скопируйте и вставьте ее в оболочку.

Как это работает

  • Сначала он запускает git remote, чтобы получить имя пульта дистанционного управления по умолчанию (обычно origin)
  • Затем он находит URL-адрес, который в настоящее время настроен и является (или может быть) неправильным, запустив git remote get-url $remote_name.
  • Затем он получает правильный URL. Я не нашел прямого способа найти его, поэтому вот что я делаю: я запускаю git fetch с опцией --dry-run (сухой прогон ничего не делает, поэтому на самом деле ничего не получается. Это помогает, если вы не хотите ничего менять , хотя обычно нет причин избегать выполнения выборки). Если есть предупреждение, Git выводит его в STDERR. Чтобы захватить его, я использую замена процесса, а затем анализирую сообщение с помощью 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
}

Как это работает

Он очень похож на первый, но вместо того, чтобы печатать команду, он сохраняет все части в массив вызывает 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

Это находит все репозитории путем поиска каталогов, содержащих .git (как в виде файла, так и в виде каталога: обычно это каталог, но это файл для подмодулей). Затем для каждого репо он входит в него, вызывает функцию и возвращается.

Если вы клонировали из www.github.com, он выдаст вам это сообщение, потому что он предпочитает github.com (без www). Со мной случилось сегодня.

В моем случае единственной разницей была косая черта / на URL-адресе, возвращаемом предупреждением от GitHub.

Добавление косой черты в мой файл конфигурации заставило предупреждение исчезнуть.

Как ни странно, я делал git fetch --all, и только для пульта my требовалась последняя косая черта, а другим (origin и сопровождающим) репозиториям GitHub он не нужен. Скорее сбивает с толку.

Это также может произойти, если вы оставите расширение .git выключенным при клонировании, а ваши пульты дистанционного управления настроены без него. Например git clone https://github.com/myuser/myrepo. Вместо https://github.com/myuser/myrepo.git

Дубликат ответа @Dimitry выше

Chris Keefe 12.07.2021 21:16

В моем случае я использую azure git и отправляю PAT с помощью команды git clone в URL-адресе сервера. Он уже включен в http.extraHeader = "etc". Это дает такое предупреждение. Когда я удалил PAT из URL-адреса, предупреждение исчезло.

Другие вопросы по теме