Brian Tanaka's Blog

[ Home | | RSS 2.0 | 2010 Archive | 2009 Archive | 2008 Archive ]


Sat, 25 Oct 2008

Preserving Group Write on Git Objects in a Collaborative Repository

If you're having trouble with group permissions on git objects in a shared environment, read on.

Recently, I needed to set up a git repository to which a number of people would need to push. I used Don Marti's excellent article on LinuxWorld, Getting a static web site organized with git as a guide.

Everything went according to plan. I created a new user and group, added the user accounts of all the collaborators to the newly created group, made the home directory (where the repository would live) setgid, git init, created a subdirectory for the working files that would be served by Apache, and installed the post-update hook that keeps the working files checked out. (I'm breezing through these steps. You can get more detail by reading Don's article.)

At first everything worked correctly, but once multiple people had git pushed to the repository, we began running into permissions issues despite the setgid. They manifested roughly like so:

$ git push
Counting objects: 7, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 376 bytes, done.
Total 4 (delta 3), reused 0 (delta 0)
error: unable to create temporary sha1 filename ./objects/tmp_obj_gBZ5Rl:
Permission denied

fatal: failed to write object

Inspection revealed that git objects were being written to .git/objects with the group write permissions bit off.

The solution turned out to be fairly straightforward. In the file .git/config, I added a line that read: "sharedRepository = group", like so:

        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        sharedRepository = group

Thereafter, new files in .git/objects were created with the proper permissions for group write. (However, note that new files are group-owned by the primary group of the user account via which the push was received. If the users collaborating on the project have different primary groups, and if those users do not share membership in that set of groups, you may still run into problems.)

Disclaimer: I'm far from being a git expert. Though this solution worked for me, you're advised to do additional research on your own. For example, while writing this post, I stumbled upon this article that has extra, useful looking information you should read: Converting a Shared Subversion Repository to Git (The section titled "Make the shared Git repository" in particular.)

Happy collaborating!


posted at: 11:11 | path: /git | permanent link to this entry

Wed, 16 Jul 2008

Redirecting a GET URL with a Name-Value Pair to a Flat Directory URL

The problem -- You have an HTML form whose action points produces a GET URL like this: but you want to redirect it to a flat directory style URL like:

The solution -- Use Apache's mod_rewrite. In your .htaccess file do this:

Options +FollowSymlinks
RewriteEngine on
RewriteCond %{QUERY_STRING} ^s=(.*)$
RewriteRule .* /%1? [R,L]

How it works:

Hope that helps someone out there. The important thing to remember here is that you have to match the name-value pair in the QUERY-STRING condition, not in the RewriteRule. If you notice anything incorrect about this solution and want to comment, send me an email and I'll post your comment as an addendum.

posted at: 11:11 | path: /apache | permanent link to this entry

Fri, 16 May 2008

RSS Feed for This Blog Fixed

Those of you who like RSS feeds may have noticed that the feed for this blog has been broken since my site redesign. I'm glad to say that it's now working properly. There's a link at the end of each story, and the URL is: Enjoy!

posted at: 11:11 | path: /misc | permanent link to this entry

A Super Simple Tea Timer in Perl

Lately, I've been using Ubuntu about fifty percent of the time throughout my workday. I used to use Linux 100% of the time (Slackware or Debian), but for the last few years I've been using Mac OS X 100% of the time. Making the switch from Linux to Mac OS X was largely snag-free, but I did have to spend a fair amount of time finding applications in Mac OS X that performed all the functionality I was used to in Linux. Now, that I'm using Linux again, at least half-time, I find I'm having to go through the same exercise of finding apps and utilities that do what I need. Mostly, this has been very easy.

One exception has been annoying because it's something that's so trivial, one would assume it'd be easy to take care of right off the bat. Namely, I need a simple "tea timer" utility. You know... you tell it how many minutes to count, and when that many minutes has passed, it makes an obnoxious sound.

I've looked around a few times now for such a beastie. There are a couple of things that are pretty close, but nothing that exactly fits the (simple) bill. Today, annoyed by the absence of a tea timer again (I use timers all the time for various reasons -- the major one right now being that I have to enforce typing breaks because I have a slipped disc and if I type like a fiend for hours on end, I end up in a lot of pain), I decided to just hack one out in Perl.

This was definitely a case of "Perl to the rescue." It took a couple of minutes to make a script that did exactly what I want -- much less time than I've spent scouring the 'net for a utility to do the same thing. Plus, since it uses mpg123 to play the alarm, I can use any sound I like, as long as mpg123 can play it. I ended up making a little series of chimes in Garageband for the alarm. Works great.

Here's the script. It's not the world's most elegant, but it's perfectly fine for the purpose at hand:

mbp:~$ cat bin/teatimer 

$limit = $ARGV[0] * 60;
print "Starting tea timer for $ARGV[0] minutes ($limit seconds)...\n";

while ( $limit > 0 ) {
	print "seconds remaining... $limit\n";
	sleep 1;

print "ding!\n";
exec("/path/to/mpg123 /path/to/alarm.mp3");

posted at: 11:11 | path: /linux | permanent link to this entry

Tue, 06 May 2008

Site Redesign

For various reasons, I've redesigned my site. By "redesign" I don't just mean how it looks. The fundamental underpinnings of the site -- how it works -- are totally different now. In future posts, I'll describe what changes I made, how, and why.

posted at: 11:11 | path: /misc | permanent link to this entry

Made with PyBlosxom