Hmm… I want to show the current branch and status of my Git repository on my Windows PowerShell prompt. I found a post on Stack Overflow that gives a good example of showing Git repo status on a PowerShell prompt, but I customized it a bit to show data I want to see.
Git status on my PowerShell prompt when the index and working directory are clean:
When there are differences in the Git index or in the working folder then the prompt will look like the following:
The meaning of the status is documented on the git-status man page for the --s, –short, or --porcelain argument. I’m using git status –porcelain, as it not supposed to change in the future. Please note that I replace the space in the status with a dash.
The script for the profile.ps1 file follows:
$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("")
$statusString = ""
$symbolicref = git symbolic-ref HEAD
if($symbolicref -ne $NULL)
{
$statusString += "GIT [" + $symbolicref.substring($symbolicref.LastIndexOf("/") +1) + "] "
$status = git status --porcelain #--untracked-files=all
if ( $status )
{
$matches = [regex]::matches([system.string]::join("`n", $status), "(?m)^.{2}")
$statusTotals = # Create hash table
foreach ( $match in $matches )
{
if ( ![string]::IsNullOrEmpty($match.Value) )
{
$matchValue = $match.Value.Replace(" ", "-")
if ( !$statusTotals.ContainsKey($matchValue) )
{
$statusTotals.Add($matchValue, 1)
}
else
{
$statusTotals.Set_Item($matchValue, $statusTotals.Get_Item($matchValue) + 1)
}
}
}
foreach ( $dictEntry in $statusTotals.GetEnumerator() | Sort-Object Name)
{
$statusString += $outVal = [string]::format("{0}:{1} ", $dictEntry.Name, $dictEntry.Value)
}
}
else
{
$statusString += "nothing to commit (working dir clean)"
}
}
else
{
$statusString = "PS "
}
if ($statusString.StartsWith("GIT")) {
Write-Host ($statusString + [System.Environment]::NewLine + $(get-location) + ">") -nonewline -foregroundcolor yellow
}
else {
Write-Host ($statusString + $(get-location) + ">") -nonewline -foregroundcolor green
}
return " "
}
You can place your profile.ps1 file in your ~\Document\WindowsPowerShell folder.
I created a short screen cast to go over the Git PowerShell prompt as well:
Hope you like it :-) It has brought me much Git PowerShell happiness :-D
Next entry: Why is PowerShell losing my carriage returns and line feeds?
Previous Entry: Moq – Use Setup arguments (parameters) in the Returns of a mocked function
Latest entries:
Create absolute URLs using ASP.NET MVC
Comments
My Links
Tags
Follow me
About
Powered by FoxBlog
Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.
© Copyright 2011, Nathan Fox