More fights with Gitweb and Dreamhost

Time to setup gitweb on a Dreamhost hosted domain. Incredible number of headaches:

First, I didn’t had a copy of gitweb on my $HOME there, so I decided to download the latest version and install it, following most of my previous install.

Git worked fine on Dreamhost, so I created the repository directory, initialized the git repo there and tried to push from my local repo to the server repo. That’s when I got my first “couldn’t find libcurl.so.4”. At first, I thought the problem was happening ’cause I was running Git 1.5 on my laptop and 1.6 on Dreamhost, but upgrading my local install didn’t solve the problem. Even, I have “libcurl.so.4” on my local files directory there. That’s when I found out that .bash_profile is not sourced when using SSH. Copying the contents of .bash_profile to .bashrc made git push happy again.

Just dropping gitweb.cgi on the domain directory didn’t work: I got a “404 – No projects found”. Hunting in the web I found that you need to add a gitweb-config.pl with the gitweb.cgi. The contents should look something like this:
# where's the git binary?
$GIT = "/home/slowsloth/packages/bin/git";
# where's our projects?
$projectroot = "/home/slowsloth/git.deadbraincells.org/";
# what do we call our projects in the ui?
$home_link_str = "home";
# where are the files we need for web display?
@stylesheets = ("/gitweb.css");
$logo = "/git-logo.png";
$favicon = "/favicon.png";
# what do we call this site
$site_name = "DeadBrainCells' Git Repository";
# these variables should be empty
$site_header = "";
$home_text = "";
$site_footer = "";
$projects_list = "";
$export_ok = "";
$strict_export = "";

# some other config variables I found around
$projects_list_description_width = 50;
$project_maxdepth = 10;

Well, thing is, it didn’t work (and I still got “404 – No projects found”. Then I decided to read the gitweb.cgi source and found that the name for the config file is, actually, gitweb_config.perl. Renaming it removed the “404”s, but it won’t display any projects.

After changing a few values with no result, I decided to check the apache error logs to see if there was something there. And there was. Again, the message about not finding the “libcurl.so.4”. I tried to add an .htaccess with SetEnv LD_LIBRARY_PATH "/home/slowsloth/packages/lib", which didn’t work. Then, change the $GIT on the config file to $GIT = "LD_LIBRARY_PATH=/home/slowsloth/packages/lib /home/slowsloth/packages/bin/git", but it also didn’t work (now complaining about not finding the command.) The last resort was create a small wrapper around git, which I called gitwrap.sh:
#!/bin/sh
export LD_LIBRARY_PATH=/home/slowsloth/packages/lib
/home/slowsloth/packages/bin/git $*

The final step was replace the $GIT to call gitwrap.sh instead of git and voilà, gitweb running.

Git repositories on Dreamhost via SSH

After some mucking around, I managed to create a remote repository for Git projects on my Dreamhost account, without the need of WebDav. Here are the steps:

  1. First, you’ll need to install Git on the server side. But git also requires Curl, so the first step is compiling Curl.
    Get curl here and Git here.

  2. Install Curl using the default process of ./configure && make && make install. Just remember that you are working on your own home directory, so you’ll need to run ./configure with a --prefix like $HOME/software or something (just a suggestion, thought. But the prefix must be somewhere in your home directory.
  3. Now, to install Git, you need to configure it with ./configure --with-curl --includedir=$HOME/software/include/. Why? Because your curl headers are in $HOME/software and, without that, Git won’t compile with Curl and SSL (required for SSH). After the configure, you need to run make NO_MMAP=1 (as pointed by the Dreamhost Wiki, I haven’t tried without it but there they say it makes bad things like rape small children or kill Git processes or something.). Once it finishes compiling, install it with make NO_MMPAP=1 install (again, I’m not sure if the NO_MMAP=1 flag is required here, but I used it just to be sure.)
  4. Next step is to make Git accessible. Edit your .bash_profile and add $HOME/software/bin to your PATH. Note that changing it on your .bashrc doesn’t work — You have to add it on your .bash_profile. You’ll probably want to disconnect and connect again just to be sure that it will work (call git after logging again; if it complains about unknown command, your PATH is not right.)
  5. Almost done with the server side. Now you need to create the repository for your projects. Putting it into your “host directory” (the directory with your webpage) will make it easier to someone clone it. So go there and mkdir project && cd project && git --bare init-db. That will create a bunch of directories needed by Git.

Now you’re done with the server side. This step assumes that you already have a local Git repository (e.g., you did a git init and committed at least one revision on it.) On your computer you’ll need to change your Git config inside your project to have the following:

[remote "hostname"]
    url = ssh://username@server.dreamhost.com/~username/hostname/project
	fetch = +refs/heads/*:refs/remotes/dreamhost/*
	push = refs/heads/*

Just be sure to change username to your Dreamhost username (twice in that row), server to the Dreamhost server you are allocated (or you can replace the whole thing with your own hostname, but you’ll still need to put it on the path), hostname is your hostname directory and project is the name of the project you created in the server. Once you updated your config, do:

  • git-update-server-info
  • git push hostname master

It should work at this point. Note that I have changed my SSH to be passwordless, so you may find an issue if you don’t.