Set up a smoking Git shell on Windows
GitHub Desktop, the application formerly known as GitHub for Windows, is a streamlined GUI that makes it easy to contribute to repositories on GitHub.
At the same time, I often hear from people that they don’t need a GUI because they’re perfectly happy to use the command line. If you feel this way, that’s great! I love the command line too! Let’s be friends!
Even so, in a set of blog posts I plan to write, I hope to convince you that GitHub Desktop is one GUI application that augments and complements the Git command line in such a powerful way that you’ll want to integrate it into your GitHub workflow.
But for now, I’ll work to convince you that GitHub Desktop is the easiest, fastest, and best way to get the Git command line set up on a Windows machine and keep that installation up to date.
Installation
Installation is easy. Visit desktop.github.com and click the big blue button that says “Download GitHub Desktop.” We use ClickOnce to streamline the installation process.
Once you install, you’ll notice a GitHub icon and a Git Shell Icon on your desktop.
By default, the Git Shell shortcut launches PowerShell with Git set up. You can also launch the Git Shell from the Desktop GUI application by pressing the ~
key (or CTRL
+ ~
at any time such as when a text field has focus) or via the gear menu in the top right. Select the “Open in Git Shell” menu item.
Support for the ~
key to launch the shell was inspired by the 3D shooter Quake which uses that key to bring up the console within the game. Many thanks to Scott Hanselman for that idea.
Sane Defaults
We often mention that we install Git with “sane defaults.” What do we mean by that? Well, let me tell you an old joke first.
Q: How do you generate a random string? A: Put a Windows user in front of vi, and tell them to exit
I can’t take credit for this joke. The first instance I’ve found is on Twitter by Aaron Jorbin.
By default, Git sets vi as the default commit editor. Statistically speaking, that’s never the right answer for Windows users. GitHub Desktop sets your default editor (typically NotePad) as the default editor via the open source GitPad tool.
Also, GitHub Desktop sets itself up as the Git credential provider. That way, you can log into the app and we’ll handle the credential management when you push to or pull from GitHub using the Git command line. This is especially useful if you have two-factor authentication enabled (WHICH YOU SHOULD!) as we handle the 2fa dance on your behalf. There’s no need for messing around with personal access (OAuth) tokens.
Posh-Git
The other “sane default” is that we include Posh-Git (maintained by Keith Dahlby) with our installation.
When you launch the shell, you’ll notice that the Powershell window now has a Git enhanced prompt that displays your current branch name. Posh-Git provides tab completion within PowerShell for Git commands and Git data. For example, you can type git {TAB}
, where {tab}
is the TAB
key, and it will complete with the first Git command (abort
in this case). Keep pressing TAB
to cycle through all the Git commands.
Likewise, if you type git checkout b{tab}
, you can cycle through all branches in your repository that start with b
.
Here is an animated gif that shows what it looks like to tab through all my repository’s branches.
PowerShell Configuration
One thing to note is that if you launch PowerShell via some other means other than our Git Shell shortcut or the Desktop application, our version of Git won’t be there. That’s because we install a portable version of Git that does not change any of your system settings.
You can add our version of Git to your PowerShell profile so it’s always there. Simply edit the PowerShell profile document: %UserProfile%\Documents\WindowsPowershell\Microsoft.Powershell_profile.ps1
Add this snippet to the file.
Write-Host "Setting up GitHub Environment"
. (Resolve-Path "$env:LOCALAPPDATA\GitHub\shell.ps1")
Shell.ps1
contains the environment settings that the Desktop application uses when it launches the Git Shell.
You can also have your default profile load up Posh-Git if you haven’t already. Make sure this snippet comes after the previous one.
Write-Host "Setting up Posh-Git"
. (Resolve-Path "$env:github_posh_git\profile.example.ps1")
$env:github_posh_git
is one of the environment variables that Shell.ps1
sets up.
The other thing to note is if you have already customized PowerShell with a profile, the Git Shell doesn’t load your existing PowerShell profile. We wanted to avoid conflicts with existing Posh-Git installs or whatever else you might have. To load your existing profile requires you to opt into this behavior. To do this, create a PowerShell script file named GitHub.PowerShell_profile.ps1
. Desktop will execute this file, if it exists.
Desktop looks for this file in the same directory as your $profile
script (typically %UserProfile%\Documents\WindowsPowershell\
). I simply load my regular profile from that script.
Here’s the full contents of my GitHub.PowerShell_profile.ps1
.
Write-Host "Setting environment for GitHub Powershell Profile"
$dir = (Split-Path -Path $MyInvocation.MyCommand.Definition -Parent)
Push-Location $dir
. (Resolve-Path "$dir\Microsoft.Powershell_profile.ps1")
Pop-Location
Turbocharge the Shell with ConsoleZ
Hey, you’re an individual and you need to express that individuality. Nothing says “I’m boring” like the default blue PowerShell console (if you do always use the default, ignore what I just said. You might be the real noncomformist). I express my individuality with a fork of Console2 called ConsoleZ just like every one of my friends! If you have Chocolatey installed, you can run this command to install ConsoleZ:
chocolatey install ConsoleZ
Then in GitHub Desktop, go to the Tools
menu (top right gear icon), select Options...
, and find the section labeled Default Shell. Select Custom and enter the path to ConsoleZ. On my machine, that’s C:\Chocolatey\lib\ConsoleZ.1.15.0.15253\tools\Console.exe
.
You’re not quite done yet. By default, ConsoleZ loads the Command shell. You’ll want to change it so it loads PowerShell.
-
Right-click in the main console and click Edit
Settings
. - Under
Tabs
, paste the path%SystemRoot%\syswow64\WindowsPowerShell\v1.0\powershell.exe
into the “Shell” text box.
You’ll notice I got a little fancy and use the Git Shell icon for the tab. I put icon here (or use our Octocat App Icon) so you can download it and do the same if you’d like. I saved the icon to the %LocalAppData%\GitHub\icons
directory and then pasted the path to the Icon in the Icon text box.
Customize ConsoleZ
That’s just enough to make ConsoleZ work with Desktop. But since you’ll spend a lot of time in the shell, let’s really turbo charge it. Here is a set of customizations adapted from Scott Hanselman’s Console2 blog post. I’ve made a few small tweaks in places to ensure that the customizations don’t interfere with the Git Shell functionality.
- Under the
Console
tab, do not enter a value for the “Startup Dir” setting as Hanselman suggests. When you launch the Git Shell from the Desktop application, it will set the working directory to the currently selected repository’s working directory. If you set ConsoleZ’s startup directory, then that feature of Desktop is overridden. If you don’t care about this feature, by all means set a startup directory. -
- Under the
Console
tab, do play around with the Columns and Rows. I have mine set to 30 rows, and 80 columns.
- Under the
-
Under Appearance
More
, hide the menu, status bar and toolbar. -
Under Appearance
Font
, set the font to Consolas 15. Unlike Hanselman’s advice, do not change the font color. Posh-Git makes important use of color. Not to mention the output of many Git commands will use color to signify additions and deletions, for example. If you want to change the default font color, do it via your PowerShell profile or by hacking Posh-Git. -
Under Appearance
Transparency
, Hanselman recommends setting Window Transparency to a nice conservative 40 for both Active and Inactive. I like setting Inactive to 80. Your mileage may vary. - Under
Hotkeys
, set “Group Tab” to something else likeCTRL+ALT+T
. This frees you up to change the “New Tab 1” hotkey toCTRL+T
as God intended. You’ll have to click on the hotkey, then in the textbox, then type the hot-key you want AND press theAssign
button for it to stick. - Under
Hotkeys
, change “Copy Selection” toCtrl-C
and “Paste” toCtrl-V
Here’s what it looks like on my machine. You can see my background image poking through.
Finally, one setting that makes ConsoleZ feel really badass to me is to go to Appearance |
Full Screen and check “Start in full screen”. I’ve been using this for a bit and it’s growing on me. Just remember, hit ALT+F4 or type exit to close it. |
Updates
We put in a lot of work to ensure that GitHub Desktop silently and automatically updates itself. When we ship an update, you’ll see a subtle notification in the application (a little up arrow in the top right) that an update is available. Just restart the application to install the update.
Desktop updates also include updates to Posh-Git, the Git command line, and Git LFS. It’s convenient to have all of that updated for you automatically so you don’t have to track down each update individually.
We keep everything updated so you don’t have to.
Conclusion
With these customizations in place, you’ll have a really great Git command line setup that we’ll work hard to keep up to date so you don’t have to. In fact, we have a few updates coming up very soon! Follow this up with some of my Git aliases and you’ll really be smoking.
Be careful though, a setup like this communicates that you’re a Git Pro and everyone will start to bug you with their Git problems. Just remember, git reflog
is your friend.
In some follow-up posts, I’ll demonstrate how this setup works really nicely in tandem with GitHub Desktop.
Comments
37 responses