v is for versioned. It's is currently only a threaded wrapper for the git commands or procedures.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.



v is for versioned. It's is currently only a threaded wrapper for the git commands or procedures. In the future it should provide a generic interface for diverse VCSs.

This Project does not have a separate test suite. This projects version-tracks itself when everything works as expected.

All operations are designed to be reimplemented as pure ruby version and their interface is almost 1:1 mapped to their ruby derivate.


gem install v

or unless you installed gemcutter

gem install gemcutter
gem tumble
gem install v


require 'v'

V.git do
  add '.'
  commit 'Initial commit!'

Git::Environment uses git returned by which git by default (*n*ix).

Change the git executable globally

V::Adapters::Git::Environment.which_git = '/usr/local/bin/git'

Change the git executable locally

env = V.git :which_git => '/usr/local/bin/git'

# or

V.git do
  @which_git = '/usr/local/bin/git'
  # ...

Working with futures...

V.git do
  # initialize repository and return environment (as future)
  init == self

  # add root to index return a index future
  proxy = add '.'
  # wait for result and return index
  proxy.value == index
  # shortcut for add '.'
  index == index << '.'

  # commit index and return commit future
  proxy = commit 'initial commit' 
  # wait for result and return commit
  commit = proxy.value

  # Queries:
  init.add('.').commit 'First argument is always the message!'

See auto_commit.rb for more examples.

Supported Operations

  • add
  • branch
  • commit
  • diff-index => diff_index (partially)
  • init
  • ls-files => ls_files (what does -v mean?)
  • ls-tree => ls_tree (alias for args)
  • push
  • rm
  • reset
  • log (partially)
  • show
  • tag

Git Objects

  • normal git objects
    • Blob
    • Commit
    • Tag
    • Tree
  • convenience objects
    • Head
    • Index
    • Branch
    • Branches
    • Commits


  • implement global cache / branch && git_dir flag expired by branch mtime
  • implement non-blocking queries
  • implement all git operations
  • ALL operations should return raw results which can be used by the convenience objects
  • implement Convenience objects (git objects call commands with arguments set, ...)
  • add Documentation and Examples
  • Long-Term: reimplement all ops in ruby, starting with plumbing

Note on Patches/Pull Requests

  • Fork the project.
  • Make your feature addition or bug fix.
  • Add tests for it. This is important so I don't break it in a future version unintentionally.
  • Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
  • Send me a pull request. Bonus points for topic branches.


  • git 1.6.3+
  • fastthread


Linus, matz and mojombo.


Copyright (c) 2009 Florian Aßmann, Fork Unstable Medie, Oniversus Media. See LICENSE for details.