web-dev-qa-db-fra.com

Que signifie réellement l'avertissement "rediriger vers"?

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?

17
Makogan
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;
}
10
VonC

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 )

9
Dmitry

Signification de l'avertissement

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.

Comment se débarrasser de l'avertissement: manuellement ...

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.

... Et avec un script Bash. Variante 1, sûre mais partiellement manuelle

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
}

Comment l'exécuter

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.

Comment ça fonctionne

  • Tout d'abord, il exécute git remote pour obtenir le nom de la télécommande par défaut (généralement Origin)
  • Ensuite, il trouve l'URL actuellement configurée et qui est (ou pourrait être) incorrecte, en exécutant git remote get-url $remote_name.
  • Ensuite, il obtient l'URL correcte. Je n'ai pas trouvé de moyen direct de le trouver, alors voici ce que je fais: je lance 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.
  • À ce stade, il vérifie si l'avertissement a été trouvé (avec l'URL correcte): sinon, il n'y a rien à faire, il imprime simplement un message et quitte.
  • Si l'URL correcte a été trouvée, elle imprime un message indiquant à la fois l'ancienne et la nouvelle, puis elle imprime la commande qui doit être exécutée pour appliquer la modification.

Variante 2, dangereuse mais entièrement automatique

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
}

Comment ça fonctionne

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[@]}".

Comment exécuter le script dans tous les référentiels Git

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.