J'ai remarqué que parfois quand je tire un projet, il y a un message disant:
"warning: redirecting to <url>"
J'ai essayé de chercher ce que cela signifie mais je ne trouve rien d'utile. Qu'Est-ce que c'est?
warning: redirecting to
Ceci est typique d'une URL de dépôt Git commençant par git://
ou http://
, mais qui est redirigé au niveau du serveur vers https://
(qui est plus sécurisé et permet l'authentification)
Ceci est défini au niveau du serveur (comme dans celui-ci ) avec un 1 déplacé en permanence .
# enforce https location / { return 301 https://$server_name$request_uri; }
vérifier à distance
git remote -v
votre télécommande est probablement https: //server/../project et ne se termine pas par . git ( https: //server/../project.git )
Comme les autres réponses l'ont expliqué, il y a une légère différence entre l'URL que vous avez enregistrée et celle que le serveur utilise. "Léger" signifie qu'il est là, mais il peut être corrigé automatiquement, donc Git ne donne pas d'erreur, mais plutôt un avertissement.
Pour vous en débarrasser, vous pouvez mettre à jour l'URL que vous utilisez, en vous assurant qu'elle correspond à la bonne. Si vous voulez le faire manuellement, vous devez utiliser la commande
git remote set-url <remote_name> <correct_remote_path>
où le remote_name
est généralement Origin
et provient de git remote
, et correct_remote_path
est celui indiqué par l'avertissement.
J'ai écrit un petit script Bash pour vérifier automatiquement cet avertissement. Il dira s'il n'y a rien à faire ou affichera la commande à utiliser pour supprimer l'avertissement. Il ne fonctionnera pas automatiquement, juste pour être sûr.
J'ai choisi d'utiliser une fonction que vous pouvez copier et coller directement dans votre Shell, vous n'avez donc pas à vous soucier de l'enregistrer dans un fichier, de vérifier le chemin d'accès au fichier, puis de le supprimer. C'est ici:
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
}
Après avoir copié et collé le script dans votre shell (requis une seule fois), accédez simplement à votre répertoire Git où vous voyez le problème et entrez check_git_redirection_warning
. Vérifiez la commande générée et, si cela a du sens (cela devrait, mais soyons en sécurité!), Copiez-le et collez-le dans le shell.
git remote
pour obtenir le nom de la télécommande par défaut (généralement Origin
)git remote get-url $remote_name
.git fetch
avec le --dry-run
option (un dryrun ne fait rien, donc rien n'est réellement récupéré. Cela aide au cas où vous ne voudriez rien changer, bien qu'il n'y ait normalement aucune raison d'éviter de lancer la récupération). S'il y a l'avertissement, Git l'imprime dans STDERR. Pour le capturer, j'utilise substitution de processus , puis j'analyse le message avec AWK (qui est normalement disponible sur n'importe quel système) et j'obtiens le 4ème mot. Je pense que cette partie échouerait s'il y avait des espaces dans l'URL, mais il ne devrait pas y en avoir, donc je n'ai pas pris la peine de la rendre plus robuste.Si vous faites confiance à mon script et souhaitez également exécuter la commande, au lieu de simplement l'imprimer, vous pouvez utiliser cette variante:
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
}
Il est très similaire au premier, mais au lieu d'imprimer la commande, il enregistre toutes les parties dans un tablea appelé mycmd
puis l'exécute avec "${mycmd[@]}"
.
Jusqu'à présent, nous avons vu comment corriger l'avertissement en un seul dépôt. Et si vous en avez plusieurs et que vous souhaitez tous les mettre à jour? Vous pouvez utiliser cet autre script ici:
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
Il trouve tous les référentiels en recherchant des répertoires contenant .git (à la fois comme fichier et comme répertoire: c'est normalement un répertoire, mais c'est un fichier pour les sous-modules). Ensuite, pour chaque dépôt, il y pénètre, appelle la fonction et revient.