There are two Terminals in Windows Command Prompt and Powershell, and they both suck by far. I can understand that Command Prompt is no good, but why the Powershell wasn’t done better?!
The things missing in Powershell:
- Maximizing is just so mid ‘90.
- History for a session only (So annoying).
- Painful adding of Aliases.
- Emacs navigation (
- Full screen and Tranparency (Oh I just want too much).
- The config dir is in
Maybe to most Windows users this is strange because this kind of stuff is never used, but if you’re coming from Linux or Mac then the frustration is certain. Because Linux or Mac are having great Terminal and working in them is just a joy.
The aim of post is to install git on Windowns and then configure it. Then customize a little bit the Powershell because the defaults are just crime against humanity. Configure SSH on machine and register SSH key with Github. Install must-have posh-git that will add the branch/status to Powershell prompt plus auto-completion for git.
Note that I’m using Windows 8 and Powershell version 3.0.
For those who might don’t know the git is created by Linus Torvalds the creator of Linux Kernel. Git was a product of his frustration maintaining Linux Kernel. He is not really the huge fan of Windows (nor am I) so git Windows implementation was hard to do because it really relies on Unix/Linux commands and philosophies that are lacking on Windows.
Download the latest msysgit and install it with just clicking next few times. There are few things to configure, but using defaults is safest way.
There is also a Github for Windows. Probably even easier way to install and configure git on Windows, but I like to complicate things.
Add Git to PATH
By default the git binaries are not set in to PATH, so add it by going to:
Control Panel/System and Security/System/Advanced system settings
Then in System Properties click on Environment Variables… and in System Variables list box
scroll to Variable
Path, double-click it and add at the end:
;C:\Program Files (x86)\Git\cmd;C:\Program Files (x86)\Git\bin;
Test that the git is available by opening the Powershell. Easiest way to open te Powershell
(if there is no shortcut) especially in Windows 8 is
Win+r and type
powershell to prompt.
In Powershell type:
1 2 3 4 5 6 7 8
If you get something like usage: git, then the git is ready!
Set the user name that will be readable in git log or history:
Then set your email:
Your email address for Git should be the same one associated with your GitHub account.
Generate SSH key
With msysgit comes a Git Bash needed to generate SSH keys. If you have one skip this step!
To open Git Bash right-click on any folder in Windows Explorer and choose Git Bash. In Git Bash enter:
1 2 3
Keygen will ask you for passphrase. In my first attempt I’ve added one, but on each commit I have to enter passphrase. That is so annoying.
If you have a SSH key passphrase and it annoys you then enter:
It will ask you for current passphrase, enter the current passphrasse, and with two enters, you’ll now have a blank passphrase!
Git Bash Copy/Paste
The copy/paste is so awful in Git Bash. To paste you need to click the icon in top left corner,
The copy is even more cumbersome, I’ll just give you a hint, choose
Or read at the end in Options Tab part of Powershell Customization to enable QuickEdit Mode.
Set SSH key to Github
To set the public SSH key in Github there is need for getting it from a
Again open Git Bash right-click on any folder in Windows Explorer and choose Git Bash. In Git Bash enter:
This command will copy your public SSH key to clipboard. Then go to
Github / Account Settngs / SSH Keys and click the button
Add SSH Key.
Enter Title (sorry about my title):
Just paste from clipboard
The visual features of Powershell probably didn’t change since Windows 95, and defaults are probably still dating from ‘95 and selecting, copy, pasting is awkward, hard and unusable!
Suck less Powershell
Click the small Powershell icon in top left corner, and in the context menu click on
Edit Options check the
QuickEdit Mode. Quick edit mode enables selecting text from
anywhere in Powershell and with right-click it will copy the selected content.
Also with single right-click pastes the text where the blinking cursor
currently is, similar to putty.
This option really boosts the productivity in Powershell, it is too bad that this is not set by default!
Even we are in 21st century but the Powershell is still set by default to
Raster Fonts with
awkward sizes like 16x12, 6x8, that I never really get the meaning of.
Font list choose the Consolas font (or other available mono-space font) and you can check the
Bold fonts if you like to have bold text. As for
Size in list choose whatever you want
I’ll stick to
The Powershell by default is very small, at least to me, maximize is totally unusable, there is no full screen!
Screen Buffer Size and
Window Position Width height should be same size if you dont want
to have ugly horizontal scroll bar. I set Width to
Window Position Height to
This are all customization, it is not too much but Powershell suck a little less after it, but there is a room for lots and lots of improvements, while Microsoft spends time on useless technologies like Light Switch.
Posh-Git: Make your Git shine in Powershell
A set of Powershell scripts which provide Git/PowerShell integration. Includes:
- Prompt for Git repositories - shows the current branch and the state of files (additions, modifications, deletions) within.
- Tab completion for git commands.
Clone it from Github to any folder, I’ll clone it in
Verify execution of Powershell scripts is allowed with:
The result should be RemoteSigned or Unrestricted.
If scripts are not enabled, run Powershell as Administrator and call:
posh-git folder and run:
1 2 3 4 5 6 7
Then reload your profile, as noted in posh-git after install note:
If you’re done everything from this post then everything should work just fine!
The outcome of whole post is to have something at the end of the day:
And just for comparison the Terminal iTerm2 on my Mac OS X Mountain Lion with zsh shell and very short aliases, pure awesomeness: