A pleasant walk through computing

Home

My Why and How of posh-git: Context Menu, Transcripts, and TF.exe

I'd been pretty happy using Cmd to run my Git command line. I didn't have requirements that forced me to use something else. But I hadn't really compared the three main command-line shells for Git on Windows (Command, Powershell, Git-Bash), or thought about features I wanted or maybe didn't know I wanted.

I didn't do an extensive review, just an exploration to see whether I wanted to change my default. The answer turned out to be "yes"!

Contents

Skip to the End!

I was persuaded by all things git's Edward Thomson's argument that Windows users shouldn't use Git-Bash for the simple reason that we shouldn't have to use a foreign operating system's shell to work with Git.

I was also persuaded by Scott Hanselman and Phil Haack that using Powershell with posh-git was an awesome Windows solution. I was even more convinced by Dave Hein's article showing how to create a simple transcription method to record git sessions. That could be a lifesaver.

Here's my current setup.

Step 1 - Install Git for Windows

You can follow the defaults and be fine. Some people recommend not changing your local PATH environment variable, but I think it's OK and reduces some friction. I do have preferred configuration answers and may blog them in the future.

Step 2 - Install posh-git

These steps assume git.exe is on your path. Steps mostly copied from Dave Hein.

  1. Open Powershell. Check the execution policy with Get-ExecutionPolicy. It should be RemoteSigned or Unrestricted[^1].
  2. cd ~\Documents and create directory GitHub.
  3. cd GitHub
  4. git clone https://github.com/dahlbyk/posh-git.git.

[^1]: Run PowerShell as administrator and call Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Confirm

Step 3 - Create a Powershell profile

Warning
Many sites that show examples of Powershell profiles for posh-git are for older versions, especially when it comes to changing the prompt.

  1. Open Documents and create a directory WindowsPowerShell if necessary.
  2. In WindowsPowerShell, use a text editor to create a file named posh-git.profile.ps1

This is my script.

    $Host.UI.RawUI.BackgroundColor = 'Black'
    $Host.UI.RawUI.ForegroundColor = 'Gray'
    Clear-Host
    
    $Env:Path = "$Env:ProgramFiles\Git\bin" + ";" + $Env:Path
    Push-Location (Resolve-Path "$Env:USERPROFILE\Documents\GitHub\posh-git")
    
    # Import the posh-git module, first via installed posh-git module.
    # If the module isn't installed, then attempt to load it from the cloned posh-git Git repo.
    $poshGitModule = Get-Module posh-git -ListAvailable | Sort-Object Version -Descending | Select-Object -First 1
    if ($poshGitModule) {
        $poshGitModule | Import-Module
    }
    elseif (Test-Path -LiteralPath ($modulePath = Join-Path (Get-Location) (Join-Path src 'posh-git.psd1'))) {
        Import-Module $modulePath
    }
    else {
        throw "Failed to import posh-git."
    }
    
    Pop-Location
    
    # Settings for the prompt are in GitPrompt.ps1, so add any desired settings changes here.
    # Example:
    #     $Global:GitPromptSettings.BranchBehindAndAheadDisplay = "Compact"
    
    $Global:GitPromptSettings.DefaultPromptBeforeSuffix.Text = "`r`n"
    $Global:GitPromptSettings.DefaultPromptPath.ForegroundColor = 'Orange'
    
    Start-SshAgent -Quiet
    
    # Start a transcript
    #
    if (!(Test-Path "$Env:USERPROFILE\Documents\WindowsPowerShell\Transcripts"))
    {
        if (!(Test-Path "$Env:USERPROFILE\Documents\WindowsPowerShell"))
        {
            $rc = New-Item -Path "$Env:USERPROFILE\Documents\WindowsPowerShell" -ItemType directory
        }
        $rc = New-Item -Path "$Env:USERPROFILE\Documents\WindowsPowerShell\Transcripts" -ItemType directory
    }
    $curdate = $(get-date -Format "yyyyMMddhhmmss")
    Start-Transcript -Path "$Env:USERPROFILE\Documents\WindowsPowerShell\Transcripts\PowerShell_transcript.$curdate.txt"
    
    # Alias TFS command line
    Set-Alias tf "${Env:ProgramFiles(x86)}\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\tf.exe"

Step 4 - Add Context Menu Entry

I frequently want to open a Git console by right-clicking in the folder. Git for Windows adds that for Git-Bash (unless you say not to). Here's the registry file to add context menu entries for our new posh-git setup.

Note
You need to replace the user profile path below with your own.

Windows Registry Editor Version 5.00

# Right-click on Explorer folder's empty space in right pane
[HKEY_CLASSES_ROOT\Directory\Background\shell\011PowershellPoshGit]
@="Open with Powershell posh-git"
"Icon"="powershell.exe"

[HKEY_CLASSES_ROOT\Directory\Background\shell\011PowershellPoshGit\command]
@="powershell.exe -NoExit -ExecutionPolicy RemoteSigned -File C:\\users\\charl\\Documents\\WindowsPowerShell\\posh-git.profile.ps1"

Step 5 - Add Custom posh-git entry to Visual Studio Open Command Line Extension

I like Mads Kristensen's Open Command Line extension to Alt-Space open a command window. If you don't use it, skip this part.

  1. Open Visual Studio > Tools > Options > Environment > Command Line
  2. In "Select preset", choose Custom.
  3. Change "Friendly name" to something like "My posh-git"
  4. Command = powershell.exe
  5. Command arguments = -NoExit -ExecutionPolicy RemoteSigned -File C:\users\charl\Documents\WindowsPowerShell\posh-git.profile.ps1
  6. Save and exit

Results

You can now right-click inside a folder and open posh-git from a menu item.

Which, in my case, gives this console. I can run both Git commands and TFS commands.

I'll get the same console if I have a solution open in Visual Studio and press ALT-Space.

To Do

  • Explore installing and using the TFS cmdlets, which might improve my weird workflow, (see below).

A Summary of How I Got Here

I originally was going to make this a review/comparison of the three command lines, but by the end of my research I realized there wasn't much point (to me) in that.

Git-Bash was off the table. The only reason I could see using it was for git aliases that rely on Unix commands, and even that seemed iffy. I'd rather rewrite such alises using native Windows commands.

My requirements were:

  1. Open the console by right-clicking an Explorer folder and choosing from the menu.
  2. Open the console by using Mads Kristensen's Open Command Line extension.
  3. Be able to run TFS commands (tf.exe)[^2].
  4. Copy/paste to/from the console easily, i.e. CTRL-C, CTRL-V.
  5. Open an explorer window into my current folder using explorer . (note the dot after the command, which means "open here".)
  6. Dynamically resize the console contents.
  7. Scroll back through commands.
  8. Powerful command line if needed.

[^2]: I have a kind of crazy work flow where I use Git locally, but check in code to TFS remotely.

References

posh-git

Creating Context Menu Entry

TFS from Powershell

Git-Bash and/or Bash on Windows (they're not the same)

Miscellaneous

How to Secure-Erase Regular and SSD Hard Drives Without Superstition

"Securely erasing a hard drive requires at least three passes"

"Securely erasing a hard drive requires randomly mixing ones and zeros"

"Securely erasing a hard drive requires 35 passes if you want to really be safe"

From my research, none of these is true. The simple facts are:

  1. To securely erase a mechanical (i.e. "magnetic" or "platter") hard drive, write one pass of zeroes (or ones) to the entire drive.
  2. To securely erase an SSD, just delete all the data. Not format. Delete.

References

This article nicely summarizes the research.

You Only Need to Wipe a Disk Once to Securely Erase It

SQL Permissions for Data Folders

I always have trouble finding how to do this. When an .mdf file is located in a folder other than the SQL's Data folder (set up during installation), it can't be seen when trying to Attach.

To make it visible, add the SQL Instance NT Service user to the folder. For example:

  • My SQL Instance is named SQLEXPRESS2016
  • My database files are in F:\SQL
  1. Right-click on F:\SQL and open Properties > Security tab
  2. Edit
  3. Add
  4. My object name would be NT SERVICE\MSSQL$SQLEXPRESS2016. You have to enter it this way, you can't search for it.
  5. Grant Full Access
  6. Save and exit

If you want to be able to use SQL's Browse button, do the same as above on the "F:" drive, but only giving Read access.