106 votes

Comment puis-je afficher le nom de ma branche git actuelle dans mon invite PowerShell ?

En gros, je cherche este mais pour PowerShell au lieu de bash.

J'utilise git sous Windows via PowerShell. Si possible, j'aimerais que le nom de ma branche actuelle soit affiché dans l'invite de commande.

1 votes

Avec Git 2.22 (Q2 2019), n'oubliez pas git branch --current .

85voto

sevenforce Points 599

Un moyen plus simple serait d'installer simplement le module Powershell posh-git . Il sort de la boîte avec l'invite souhaitée :

L'incitation

PowerShell génère son invite en exécutant une fonction d'invite, si elle existe. posh-git définit une telle fonction dans profile.example.ps1 qui produit le répertoire de travail actuel suivi d'un statut git abrégé :

C:\Users\Keith [master]>

Par défaut, le résumé de l'état a le format suivant :

[{HEAD-name} +A ~B -C !D | +E ~F -G !H]

(Pour installer posh-git, je suggère d'utiliser psget )

Si vous n'avez pas psget, utilisez la commande suivante :

(new-object Net.WebClient).DownloadString("https://raw.githubusercontent.com/psget/psget/master/GetPsGet.ps1") | iex

Pour installer posh-git, utilisez la commande : Install-Module posh-git

Pour s'assurer que posh-git se charge pour chaque shell, utilisez la commande Add-PoshGitToProfile commande .

0 votes

Comment activer ce module au démarrage ? On dirait que powershell oublie ce module à chaque fois que j'ouvre une nouvelle instance.

0 votes

@Mihir vous devez créer un profil, regarder les réponses stackoverflow.com/questions/24914589/

2 votes

@NicolaPeluchetti Merci ! J'ai suivi howtogeek.com/50236/customizing-your-powershell-profile et j'ai ajouté Import-Module posh-git dans mon profil powershell. Ça a marché comme sur des roulettes !

65voto

tamj0rd2 Points 610

Voici ce que j'en pense. J'ai modifié un peu les couleurs pour que ce soit plus lisible.

Microsoft.PowerShell_profile.ps1

function Write-BranchName () {
    try {
        $branch = git rev-parse --abbrev-ref HEAD

        if ($branch -eq "HEAD") {
            # we're probably in detached HEAD state, so print the SHA
            $branch = git rev-parse --short HEAD
            Write-Host " ($branch)" -ForegroundColor "red"
        }
        else {
            # we're on an actual branch, so print it
            Write-Host " ($branch)" -ForegroundColor "blue"
        }
    } catch {
        # we'll end up here if we're in a newly initiated git repo
        Write-Host " (no branches yet)" -ForegroundColor "yellow"
    }
}

function prompt {
    $base = "PS "
    $path = "$($executionContext.SessionState.Path.CurrentLocation)"
    $userPrompt = "$('>' * ($nestedPromptLevel + 1)) "

    Write-Host "`n$base" -NoNewline

    if (Test-Path .git) {
        Write-Host $path -NoNewline -ForegroundColor "green"
        Write-BranchName
    }
    else {
        # we're not in a repo so don't bother displaying branch name/sha
        Write-Host $path -ForegroundColor "green"
    }

    return $userPrompt
}

Exemple 1 :

enter image description here

Exemple 2 :

enter image description here

24voto

David Longnecker Points 1569

@Paul-

Mon profil PowerShell pour Git est basé sur un script que j'ai trouvé ici :

http://techblogging.wordpress.com/2008/10/12/displaying-git-branch-on-your-powershell-prompt/

Je l'ai modifié un peu pour afficher le chemin du répertoire et un peu de mise en forme. Il définit également le chemin vers l'emplacement de mon bin Git puisque j'utilise PortableGit.

# General variables
$pathToPortableGit = "D:\shared_tools\tools\PortableGit"
$scripts = "D:\shared_tools\scripts"

# Add Git executables to the mix.
[System.Environment]::SetEnvironmentVariable("PATH", $Env:Path + ";" + (Join-Path $pathToPortableGit "\bin") + ";" + $scripts, "Process")

# Setup Home so that Git doesn't freak out.
[System.Environment]::SetEnvironmentVariable("HOME", (Join-Path $Env:HomeDrive $Env:HomePath), "Process")

$Global:CurrentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$UserType = "User"
$CurrentUser.Groups | foreach { 
    if ($_.value -eq "S-1-5-32-544") {
        $UserType = "Admin" } 
    }

function prompt {
     # Fun stuff if using the standard PowerShell prompt; not useful for Console2.
     # This, and the variables above, could be commented out.
     if($UserType -eq "Admin") {
       $host.UI.RawUI.WindowTitle = "" + $(get-location) + " : Admin"
       $host.UI.RawUI.ForegroundColor = "white"
      }
     else {
       $host.ui.rawui.WindowTitle = $(get-location)
     }

    Write-Host("")
    $status_string = ""
    $symbolicref = git symbolic-ref HEAD
    if($symbolicref -ne $NULL) {
        $status_string += "GIT [" + $symbolicref.substring($symbolicref.LastIndexOf("/") +1) + "] "

        $differences = (git diff-index --name-status HEAD)
        $git_update_count = [regex]::matches($differences, "M`t").count
        $git_create_count = [regex]::matches($differences, "A`t").count
        $git_delete_count = [regex]::matches($differences, "D`t").count

        $status_string += "c:" + $git_create_count + " u:" + $git_update_count + " d:" + $git_delete_count + " | "
    }
    else {
        $status_string = "PS "
    }

    if ($status_string.StartsWith("GIT")) {
        Write-Host ($status_string + $(get-location) + ">") -nonewline -foregroundcolor yellow
    }
    else {
        Write-Host ($status_string + $(get-location) + ">") -nonewline -foregroundcolor green
    }
    return " "
 }

Jusqu'à présent, cela a très bien fonctionné. Dans un repo, l'invite ressemble heureusement à ceci :

GIT [master] c:0 u:1 d:0 | J:\Projects\forks\fluent -nhibernate>

*NOTE : Mis à jour avec les suggestions de Jakub Narebski.

  • Suppression des appels git branch/git status.
  • Correction d'un problème où 'git config --global' échouait parce que $HOME n'était pas défini.
  • Correction d'un problème où la navigation vers un répertoire qui n'avait pas le répertoire .git faisait revenir le formatage à l'invite PS.

0 votes

Merci David, j'ai pu facilement modifier ceci et utiliser les instructions de l'article du blog lié pour obtenir quelque chose qui me convient.

6 votes

Ne pas gratter la sortie de git-branch pour obtenir le nom de la branche courante ; il est destiné à l'utilisateur final (il est en porcelaine). Utilisez git symbolic-ref HEAD . N'utilisez pas git-status ; il est destiné à l'utilisateur final et est susceptible d'être modifié (il serait modifié dans la version 1.7.0). Utilisez git-diff-files, git-diff-tree, git-diff-index.

0 votes

Jakub Narebski - Mise à jour du code en fonction de vos suggestions - merci beaucoup. Puisqu'il n'appelle pas la branche et le statut, il est aussi un peu plus rapide.

10voto

JerryGoyal Points 9110

Posh-git est lent, il existe un meilleur moyen avec https://ohmyposh.dev/ .

enter image description here

  1. Exécutez cette commande depuis powershell pour installer ohmyposh module :

    Install-Module oh-my-posh -Scope CurrentUser -AllowPrerelease

  2. installer une police qui prend en charge les glyphes (icônes) de https://www.nerdfonts.com/ .
    J'aime Meslo LGM NF .

  3. définir cette police dans les paramètres par défaut de powershell :

enter image description here

  1. Ouvrir/créer un fichier Microsoft.PowerShell_profile.ps1 à l'adresse C:\Program Files\PowerShell\7 et écrivez ci-dessous pour définir le thème (comme dans la capture d'écran) :

    Set-PoshPrompt -Theme aliens

Vous pouvez également choisir d'autres thèmes. Voir l'aperçu en exécutant Get-PoshThemes

Maintenant, ouvrez powershell à l'emplacement contenant le repo git et vous verrez le statut.


Voir plus : Mettez votre PowerShell sous tension

9voto

VonC Points 414372

Avec Git 2.22 (Q2 2019), n'importe quel script (Powershell ou non) pouvait utiliser le nouveau --show-current option .

$branch = git branch --show-current

S'il est vide, cela signifie "HEAD détaché".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X