using git with focus on fun or something like that
CoffeeScript Python
Latest commit 828a2d6 Apr 25, 2016 @payload Merge pull request #9 from hoodie/master
pretty legible colors
Failed to load latest commit information.
src no recursion on trees command Aug 22, 2011
.gitignore basic stuff May 24, 2011 pretty legible colors Apr 25, 2016
package.json Removed redundant steps in package.json. Apr 18, 2013
wscript fix wscript for 0.6.x Nov 29, 2011


  • trees are a treat for treeeater
  • use it to call git commands in Node
  • it is written in CoffeeScript and is heavily using its sweet syntactic sugar
  • - yes, you can give me money :P


  • an asynchronous wrapper around git spawning commands
  • use git help to find out how to get things done
  • specify command line options in an readable and easy way in Coffee Script
  • some output is being parsed into objects which actually make some sense!

usage in Coffee Script

  • provide a callback to get the whole output
git.version console.log
# git version
  • or listen on item or data events to get it line-, item- or chunkwise
n = 0
buffer = git.log()
buffer.on 'item', (line) -> console.log "#{n += 1}:", line

buffer = 'package.json', 'HEAD^'
file = fs.createWriteStream("package.json.bak")
file.on 'open', -> buffer.pipe file
  • put command line arguments as key: value pairs or strings into your call
Git = require 'treeeater'
# an option on construction is default for all calls
git = new Git cwd: 'parrot'
# ~/parrot$ git log -1 --pretty=raw HEAD^^
log = git.log 1:null, pretty:'raw', 'HEAD^^'
log.on 'item', do_something_with_it
# change current working directory, which must exist
git.opts.cwd = 'dead'
# git init --bare -L .
git.init bare:null, L:'.'
  • some functions are not named after git commands and provide some parsed output
n = 0
commits = git.commits()
commits.on 'item', (commit) ->
    if my_email is
        n += 1
commits.on 'close', ->
    console.log "I've authored #{n} commits!"

git.tree 'HEAD', (trees) ->
    coffee = []
    tree = git.tree_hierachy(trees)
    for stuff in tree
        if stuff.type == 'tree'
            for more_stuff in stuff
                if '.coffee' in more_stuff.path
                    coffee.push more_stuff
    console.log "#{coffe.length} coffee files in level 1 subfolders"