How can I display my current git branch name in my PowerShell prompt?

前端 未结 7 2102
暗喜
暗喜 2020-11-30 20:18

Basically I\'m after this but for PowerShell instead of bash.

I use git on windows through PowerShell. If possible, I\'d like my current branch name to displayed as

7条回答
  •  借酒劲吻你
    2020-11-30 20:44

    @Paul-

    My PowerShell profile for Git is based off of a script I found here:

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

    I've modified it a bit to display the directory path and a bit of formatting. It also sets the path to my Git bin location since I use 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 " "
     }
    

    So far, this has worked really well. While in a repo, the prompt happily looks like:

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

    *NOTE: Updated with suggestions from Jakub Narębski.

    • Removed git branch/git status calls.
    • Addressed an issue where 'git config --global' would - fail because $HOME was not set.
    • Addressed an issue where browsing to a directory that didn't have the .git directory would cause the formatting to revert to the PS prompt.

提交回复
热议问题