BSD-3-Clause licensed and maintained by Vincent Hanquez
This version can be pinned in stack with:hit-0.6.3@sha256:c2bb71f239a4e38fd783f2f65784405a858a6188bc4343737c12be9d20b01ba2,4073


Hit is a reimplementation of some git operations in pure haskell.

what it does do:

  • read loose objects, and packed objects.
  • write new loose objects
  • git like operations available: commit, cat-file, verify-pack, rev-list, ls-tree.

what is doesn’t do:

  • reimplement the whole of git.
  • checkout’s index reading/writing, fetching, merging, diffing.

The main functions for users are available from the Data.Git module.

The essential functions are:

  • withRepo: create a new git context and execute a function with the context. functional equivalent of withFile but for git repository.
  • withCurrentRepo: similar to withRepo but found the repository from the user current directory.
  • resolveRevision: turns a git revision (e.g. HEAD, 0a24^^^~3) into a SHA1 reference.
  • resolvePath: from a commit ref and a path, it will gives the tree or blob reference of the object at the specific path (see example).
  • getObject: from a SHA1 reference, gives a high level object (Commit, Blob, Tree, Tag, Delta) from the git repository. if called with resolveDelta set, it will resolves deltas to be simple objects with the deltas applied.
  • getObjectRaw: similar to getObject but gives a raw representation (lazy bytestring) of the object.
  • getCommit: similar to getObject but gives back a commit.
  • getTree: similar to getObject but gives back a tree.

API Example

resolving path of the README file and returning the reference to the blob :

{-# LANGUAGE OverloadedStrings #-}
import Data.Git.Repository

showPathRef commitRef = withRepo ".git" $ \git -> do
    ref <- maybe (error "inexistent object at this path") id `fmap` resolvePath git commitRef ["README"]
    putStrLn ("README has the reference: " ++ show ref)

catting an object from a ref:

import Data.Git.Repository

catFile ref = withRepo ".git" $ \git -> do
    obj <- maybe (error "not a valid object") id `fmap` getObjectRaw git ref True
    L.putStrLn (oiData obj)

more examples on how to use api can be found in Hit.hs.