Skip to main content

My Git Setup on Windows

This is kind of a continuation of my earlier post about my terminal/shell on OS X and Linux.

As I was recently preparing for my Git on Windows talk, I naturally started tweaking the setup on Windows as well in the same direction, and I figured I'd share this setup.

Installing Git

Either go with Git for Windows, or Git Extensions if you want more GUI as well as Visual Studio integration. I personally have grown a distaste for TortoiseGit, as it sometimes locks files in my repositories. But it's supposed to be good otherwise (as an alternative for Git Extensions).

Git Extensions

During the Git install, you need to select the scary red option, for integrating Git into Windows cmd-line, if you want to use it from Powershell/Console2 (we'll get back to that later). The cygwin-like Git Bash is not sexy.
Update (30/4 2012)I think you could also wrap Console2 around Cygwin, although I haven't tried this myself yet. This way you can avoid the scary red option. There's also the alternative mintty terminal for Cygwin.
You also get asked how Git should treat line endings. There are three options, you'll need to pick the one that suits you best (you can change it later):
  • Windows style (convert to CRLF on checkout, and to unix on checkin, autocrlf true): Pick this one if you have programs that need to CRLF (notepad, scripts, tools).
  • Checkout as -is, commit unix style (autocrlf input): All your programs can deal with LF just fine. This is the Github recommends this one. 
  • Checkout as-is, commit as-is (autocrlf false): You’re OK with everything ending up like CRLF - this is OK for pure Windows environments. It is not cross platform friendly.

Authing against Github with Putty


It is possible to get away with using the OpenSSH that installs along with Git, but as far as I know that will only work for command-line, and not for GUI tools. The Github docs explain that Putty is not supported for SSH auth, but that's bollocks. It works just fine.

Download and install Putty (you'll want the Windows installer for everything except PuTTYtel option).

If you're unfamiliar with the Putty tools, I'm not going to go too much into it, but you're gonna:
  • Use puttygen for generating a SSH key
  • Run pageant in the background, serving ssh-authentication (for any program that might ask, like Git Extensions, or TortoiseGit)
  • Offer plink to the git command line as an authentication method (GIT_SSH)
When you generate a key in Putty, make sure you have at least 768 bits in the RSA key (2048 is good). Any less, and Github (and probably most other SSH servers) will reject the authentication without any explanation.

Generating a key with putty
After the key is generated, copy and paste the public key into your SSH keys in your Github settings.

Save the private key file as $HOME/keys/id_rsa.pkk or something like that.

Open Putty/Pageant, go Add Key, and select the pkk file you just saved.

Set an environment variable called GIT_SSH to point at C:\Program Files (x86)\PuTTY\plink.exe or wherever you installed Putty/plink.

Open a command line window and do


git clone [one of your github repos SSH urls]

This should work with no problem. If it doesn't work, something has gone wrong in the setup:
  • Pageant isn't running with the right key
  • You didn't set up GIT_SSH properly (echo %git_ssh% to check)
  • You didn't paste the key correctly into the Github settings
  • You generated a key with less than 768 bits
Update (01.05.2012): If you run into this error message: 
The server's host key is not cached in the registry. Youhave no guarantee that the server is the computer youthink it is. 
It means that Github's SSH server needs to be authorized (I actually only noticed this when cloning from Gitorious, never saw it from Github). People usually solve this by doing an ssh git@server.com, and answering yes when prompted, but since Putty keeps its authorized keys in a different place, you have to: 
  • Open Putty
  • Enter git@server.com in the Host Name field
  • Pick Never under 'Close window on exit'
  • Select Open. 
  • Click yes when the question pops. You should see something like this:
Using username "git".Authenticating with public key "rsa-key-20120429" from agentServer refused to allocate ptyHi tfnico! You've successfully authenticated, but GitHub does not provide shell access. 
Now cloning should work.

Note that if you want to skip SSH entirely (I've actually seen company firewalls that block SSH), and just use Smart HTTP authentication (https). You'll get asked for password each time, so specify the credentials in your home-directory, in a file called _netrc like this:


machine github.com
login tfnico
password sekrit


Note that the password value is not very friendly towards special characters. But hey, if you wanted security, you should've gone with SSH instead.

The console window

First thing up is Console2. It's a wrapper of the normal command-line in Windows, which still, oh so many years later, sucks really hard. Console2 has tabs, sensible copy/paste, and nicer color options. Scott Hanselman has pretty much summed up the useful tweaks, and I won't add much else than a screenshot.

Console2 with Poweshell & git-posh

Key steps are:
  • Paste this Solarized color theme into your Console2 config
  • Pick a nicer font (Lucida console?)
  • Use Powershell as shell (because of posh-git)
  • Remove unnecessary toolbars and menus
  • Enable Copy-on-select
  • Remap New Tab (Ctrl + T) and Paste (Ctrl + V)
  • Install posh-git (shows repo status in PS1, requires Powershell)
The posh-git prompt is a bit sluggish (although much better than the first time I tried it), but all in all, Console2 is really comfy, and this setup works pretty sweet. 

Comments

  1. Just a quick follow-up, I think you could also wrap Console2 around Cygwin, although I haven't tried this myself yet.

    There's also the alternative mintty terminal for Cygwin.

    ReplyDelete
  2. Another note: Github just released Github-for-windows, which should make it pretty easy to get up and running quickly.

    ReplyDelete
  3. Anonymous5/1/13 17:51

    What about hostnames in the tabs? No point in having tabs with hostnames.

    ReplyDelete
  4. @Anonymous: Not sure what you mean there, or how hostnames are relevant to this post.

    ReplyDelete

Post a Comment

Popular posts from this blog

Managing dot-files with vcsh and myrepos

Say I want to get my dot-files out on a new computer. Here's what I do:

# install vcsh & myrepos via apt/brew/etc
vcsh clone https://github.com/tfnico/config-mr.git mr
mr update

Done! All dot-files are ready to use and in place. No deploy command, no linking up symlinks to the files. No checking/out in my entire home directory as a Git repository. Yet, all my dot-files are neatly kept in fine-grained repositories, and any changes I make are immediately ready to be committed:

config-atom.git
    -> ~/.atom/*

config-mr.git
    -> ~/.mrconfig
    -> ~/.config/mr/*

config-tmuxinator.git  
    -> ~/.tmuxinator/*

config-vim.git
    -> ~/.vimrc
    -> ~/.vim/*

config-bin.git   
    -> ~/bin/*

config-git.git          
    -> ~/.gitconfig

config-tmux.git  
    -> ~/.tmux.conf    

config-zsh.git
    -> ~/.zshrc

How can this be? The key here is to use vcsh to keep track of your dot-files, and its partner myrepos/mr for operating on many repositories at the same time.

I discovere…

The End of GitMinutes (my podcast)

I'm just about ship GitMinutes episode 46, which is going to be the final episode. I'll just paste the outro script here, as it sums up the sentimental thoughts pretty well:

I’m happy to have finally finished [publishing the last episodes from Git-Merge 2017], just in time before Git-Merge 2018 takes place in March. I won’t be going there myself, so I’m counting on someone else to pick up the mic there.

It’s sad to be shipping this one as it is probably the last GitMinutes episode ever. To go a bit down memory lane, 6 years ago, my daughter was born, and as I used a little of that paternity leave to set up my podcasting infrastructure and produce the first few episodes. Initially it was just going to be 10 episodes and call the experiment finished. Instead, I got to 46 episodes, the last dozen or so lazily tailing the last few Git-Merge conferences.

To every one of my guests, thank you so much again for coming on to share your passion in this little niche of computer science a…

Joining eyeo: A Year in Review

It's been well over a year since I joined eyeo. And 'tis the season for yearly reviews, so...

It's been pretty wild. So many times I thought "this stuff really deserves a bloggin", but then it was too inviting to grab onto the next thing and get that rolling.

Instead of taking a deep dive into some topic already, I want to scan through that year in review and think for myself, what were the big things, the important things, the things I achieved, and the things I learned. And then later on, if I ever get around to it, grab one of these topics and elaborate in a dedicated blog-post. Like a bucket-list of the blog posts that I should have written. Here goes:
How given no other structures, silos will grow by themselves This was my initial shock after joining the company. Only a few years after taking off as a startup, the hedges began growing, seemingly almost by themselves, and against the will of the founders. I've worked in silos, and in companies without the…

Working in Teams over Working as Individuals

I recentlypostedthis sketch on Twitter:

Thanks to a few mighty retweets, it gathered a lot of views (9000 impressions, whatever that means). While that's fun and all, I still felt a bit sad that such an awfully simple insight can garner much more popularity than a thorough blog post that I put some hours into.

So, rather than let Twitter get away with this, I'll steal my own content back into the blog :)

The thread went like this:

Pondering how to battle individualism in companies. For some, it is counter-intuitive that teams can be more responsive, faster and even more accountable than single individuals.

Having "teams" in place is no guarantee that team work is happening. Be wary of too large teams, "I/me/mine", personal contact details instead of team point of contact. Good team is sailing crew, not galley slaves.

Beware heroes, go-to persons, calling in favors and other shadow handling of work. Real teams make the work explicit, both requests/needs and re…

Encrypting and Decrypting with Spring

I was recently working with protecting some sensitive data in a typical Java application with a database underneath. We convert the data on its way out of the application using Spring Security Crypto Utilities. It "was decided" that we'd be doing AES with a key-length of 256, and this just happens to be the kind of encryption Spring crypto does out of the box. Sweet!

The big aber is that whatever JRE is running the application has to be patched with Oracle's JCE in order to do 256 bits. It's a fascinating story, the short version being that U.S. companies are restricted from exporting various encryption algorithms to certain countries, and some countries are restricted from importing them.

Once I had patched my JRE with the JCE, I found it fascinating how straight forward it was to encrypt and decrypt using the Spring Encryptors. So just for fun at the weekend, I threw together a little desktop app that will encrypt and decrypt stuff for the given password and sa…