7 votes

L'invite ne met pas à jour la branche git

J'ai essayé d'intégrer la branche git actuelle dans mon invite, mais elle ne se comporte pas comme prévu. J'utilise bash sur ubuntu 16.04 et git 2.7.4. Lorsque je démarre un terminal, rien de git n'est affiché. Si je source mon .bashrc depuis l'intérieur d'un dépôt, la branche est affichée, mais ne se met plus à jour. Voici ce que j'ai écrit dans mon .bashrc :

green="\[\033[01;32m\]"
blue="\[\033[01;34m\]"
no_color="\[\033[00m\]"
purple="\[\033[01;35m\]"

source ~/.git-prompt.sh
export PS1="$purple\u $green$(__git_ps1 " (%s)") $blue\W $no_color \$ "

Mise à jour :

J'ai essayé de suivre les instructions dans git-prompt mais toujours le même résultat. Cependant, si je copie simplement la suggestion de git-prompt : PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ ' ça marche, mais bien sûr ça ne ressemble pas à ce que je veux. Y a-t-il une erreur de syntaxe que j'ai manquée ? Le modèle PS1 fonctionne même si vous n'utilisez pas l'exportation. PS1=...

10voto

Picard Points 301

Ok, j'ai trouvé la solution. Il n'est pas nécessaire d'utiliser la commande prompt. Le bug est dû à une erreur de syntaxe.

Si j'assigne le contenu de PS1 avec "" afin d'utiliser mes variables pour les couleurs, il n'exécute la fonction __git_ps1 que lorsque .bashrc provient d'une source.

Mais lorsque j'assigne le contenu du PS1 dans '' et le faire sans variables pour la couleur et à la place écrire les codes, cela fonctionne comme prévu. Et comme je lis ici il semble que ce soit une meilleure pratique de ne pas exporter PS1 vers l'environnement.

La solution ressemble donc à ça :

PS1='\[\033[01;35m\]\u \[\033[01;32m\]$(__git_ps1 " (%s)") \[\033[01;34m\]\W \[\033[00m\] \$ '

Cependant, je serais curieux de savoir quelle en est la raison. Cela fonctionne dans "" dans macOS.

2voto

Stewart Points 1385

C'est parce que .bashrc n'est lu qu'une seule fois : lorsque vous démarrez un nouveau Shell interactif et non connecté (lorsque vous ouvrez un nouveau terminal, par exemple). Ainsi, le PS1 est défini la première fois que vous ouvrez le terminal et n'est jamais modifié.

La bonne manière de procéder (en supposant que votre git-prompt y __git_ps scripts fonctionnent comme prévu) est d'utiliser PROMPT_COMMAND . Comme expliqué dans man bash :

   PROMPT_COMMAND
          If set, the value is executed as a command prior to issuing each
          primary prompt.

Vous voulez __git_ps1 à exécuter avant que chaque invite ne soit affichée (donc après chaque commande que vous exécutez ; après une cd par exemple). Par conséquent, vous devez le mettre dans PROMPT_COMMAND . Si votre __git_ps1 est ce que je pense qu'elle est, elle se mettra en place PS1 pour vous. Il vous suffit de l'exécuter à chaque fois qu'une invite est affichée. Donc, ajoutez cette ligne à votre ~/.bashrc :

PROMPT_COMMAND="$purple\u $green$(__git_ps1 "(%s)") $blue\W $no_color \$ "

Enfin, je ne peux pas être sûr puisque vous ne montrez pas les scripts pertinents, mais je doute fortement que le (%s) a un sens ici. Cela va juste imprimer la chaîne %s . Si vous avez besoin d'aide supplémentaire, veuillez modifier votre question et i) inclure les deux éléments suivants __git_ps1 y /etc/bash_completion.d/git-prompt (ou dites-nous comment vous les avez installés s'ils proviennent d'un paquet Ubuntu) et ii) montrez-nous à quoi votre invite est censée ressembler.

2voto

C14L Points 349

J'ai rencontré le même problème. Vous pouvez simplement échapper le $(...) a \$(...)

export PS1="$purple\u $green\$(__git_ps1 " (%s)") $blue\W $no_color \$ "

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X