Showing posts with label git. Show all posts
Showing posts with label git. Show all posts

November 22, 2014

Setting up Git, SVN, curl and SSH on Windows using Cygwin terminal

I have previously mentioned that on my home computer, which is a Windows-running machine, I use Cygwin shell with a Console2 terminal. I have gotten used to Unix commands and infrastructure as I use them at work, and the Windows CLI just felt... well, flat in comparison.

Cygwin and Console2 are a nice remedy to implement a familiar interface for Windows. Let's start with Cygwin.

In their own words, Cygwin is "a large collection of GNU and Open Source tools which provide functionality similar to a Linux distribution on Windows". And frankly, this is the least finicky way I've been able to use Git on Windows. A lot of other GUI-based Git interfaces are pretty bad, and it's always better practices to learn and know the command line commands. So, speaking of, once you downloaded Cygwin, you choose your install directory, as well as a downloaded packages directory - it is here that "modules" such as Git gets installed into Cygwin. Get to know and love the Packages interface in Cygwin, chances are that if you are missing a module and need to install it later, you will be running Cygwin's installation program again (which now skips right to the packages window) to add what you need.

For a first-time install, I usually kick off my setup with a few choice packages such as:

  • vim (ironically for a UNIX emulator, this is actually not enabled by default)
  • OpenSSH
  • AutoSSH
  • PHP interpreter
  • curl
  • PHP-curl
  • Git (be sure to select the ca-certificates and libsasl2 packages as well - oddly they are not chosen as dependencies (unless you install the curl package as above). See here for more info, else you'll be running into "cannot open shared object file: No such file or directory" HTTPS git errors!)
  • Git/SVN
  • lib-mcrypt

These make it convenient to run commands straight from the Cygwin shell, for example if I need to run a quick cURL call or something. The SSH client is pure command line, so no need to fiddle around with crappy Windows GUI clients or yet another terminal emulator like PuTTY.

After selecting your desired Cygwin packages, you can complete the installation, noting the prompt to install dependencies for your selected packages. I usually go back and disable a few at this point, because - for example - blanket enabling the entire PHP5 package would then enable other packages like PHP5-apache2, which then have their own dependencies like the large Apache2 package which I personally won't need at all.

After installing, you can open your Cygwin shell, and see something like this message on the first load:
Copying skeleton files.
These files are for the users to personalise their cygwin experience.

They will never be overwritten nor automatically updated.

'./.bashrc' -> '/home/User//.bashrc'
'./.bash_profile' -> '/home/User//.bash_profile'
'./.inputrc' -> '/home/User//.inputrc'
'./.profile' -> '/home/User//.profile'

User@location ~
$ |

Right now, you're probably thinking that it's nice to have a UNIX shell, but the default Windows terminal that still wraps it is not very nice. I am of the same opinion. In the next post we will spruce things up a bit with Console2, entirely replacing the vanilla cmd terminal that the Cygwin shell still defaults to, and in a future post go over some Cygwin-specific tips.

September 4, 2014

How to set up a private Git server on a Raspberry Pi (or any Linux-based OS, really)

Paying for private Git space sucks. And sometimes some code is really not worth putting out onto the greater web, or really doesn't need to be up there. The solution is to privately host your repository!

A Raspberry Pi is a super cheap, small, power-effective computer, excellently re purposed as a Git server. Start by installing some dependencies - chances are, if you're running Raspbian, you may already have these.
sudo apt-get install wget git-core

It is good practice to set up a dedicated system user, in this case we are calling the user git with a home folder location at /home/git
sudo adduser --system --shell /bin/bash -gecos 'Raspberry Pi Git user' --group --home /home/git git

Enter the user's home folder, and initialize a new bare git repository:
su git
cd /home/git
mkdir newrepo.git
cd newrepo.git
git --bare init

And your Pi is now set up with a shiny new repository, ready to accept some files!

Return to your host machine, and go to the root of the new project that is about to get pushed to the new repository. At this point, it is a good idea to check your .gitignore file to make sure you aren't about to push stuff that shouldn't be version-controlled. Replace the IP address below as needed; or better yet, hostname if that is set up (mine is just running on my local network). We will now tell our host machine where to push to, then will commit the project, and actually push it:
git init
git remote add origin git@192.168.0.xx:/home/git/newrepo.git
git add .
git commit -m "First commit"
git push origin master

If, like me, you already had a git work tree set up, but the old repository is now defunct, you can instead just change the repo location like this:
git remote set-url origin git@192.168.0.xx:/home/git/newrepo.git
git push origin master

This will retain your entire git history, even though you may previously have been pushing to a different repository. If you had the entire history checked out locally before your switchover, that history will be uploaded to the new location as well.

Finally, as a last quality-of-life tweak, upload your public SSH key to your remote user's ~/.ssh/authorized_keys file. This stops the annoying password prompts during every push, but is just as secure.

Lastly, back on the host machine, it might be worth setting Git's case-sensitivity off via git config core.ignorecase false.