Я заметил, что иногда, когда я git pull проект, появляется сообщение:
"warning: redirecting to <url>"
Я попытался найти, что это значит, но ничего полезного не нашел. Что это?
Проблема заключалась в том, что в моем случае на локальном .git/config
удаленный URL-адрес был установлен на https://gitlab.com/group/subgroup/project
, но gitlab перенаправлен на https://gitlab.com/group/subgroup/project.git/
. Установка URL-адреса непосредственно на project.git
исправила это.
При клонировании с www.github.com будет выдано предупреждение о перенаправлении, поскольку он предпочитает github.com без префикса www.
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 для автоматической проверки этого предупреждения. Он скажет, нечего ли делать, или напечатает команду для удаления предупреждения. Он не будет запускать его автоматически, просто на всякий случай.
Я решил использовать функцию, которую вы можете скопировать и вставить прямо в свою оболочку, поэтому вам не нужно беспокоиться о ее сохранении в файл, проверке пути к файлу и последующем его удалении. Вот:
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
.git fetch
с опцией --dry-run
(сухой прогон ничего не делает, поэтому на самом деле ничего не получается. Это помогает, если вы не хотите ничего менять , хотя обычно нет причин избегать выполнения выборки). Если есть предупреждение, Git выводит его в STDERR. Чтобы захватить его, я использую замена процесса, а затем анализирую сообщение с помощью 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
}
Он очень похож на первый, но вместо того, чтобы печатать команду, он сохраняет все части в массив вызывает 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
Это находит все репозитории путем поиска каталогов, содержащих .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 выше
В моем случае я использую azure git и отправляю PAT с помощью команды git clone в URL-адресе сервера. Он уже включен в http.extraHeader = "etc". Это дает такое предупреждение. Когда я удалил PAT из URL-адреса, предупреждение исчезло.
Может быть, git получил ответ Redirect из репозитория, чтобы проверить другой URL-адрес?