Support for on-disk and in-memory Git stores. Can read and write all
the Git objects: the usual blobs, trees, commits and tags but also
the pack files, pack indexes and the index file (where the staging area
All the objects share a consistent API, and convenience functions are
provided to manipulate the different objects. For instance, it is
possible to make a pack file position independent (as the Zlib
compression might change the relative offsets between the packed
objects), to generate pack indexes from pack files, or to expand
the filesystem of a given commit.
The library comes with a command-line tool called
ogit which shares
a similar interface with
git, but where all operations are mapped to
the API exposed
ocaml-git (and hence using only OCaml code).
The API documentation is available
Build and Install Instructions
To build and install the project, simply run:
$ opam install git
What is supported
The loose object files can be read and written;
The pack files
(collections of compressed loose objects using a binary-diff representation)
and pack indexes
(indexes of pack files) can be read and
written). The binary diff hunks are exposed using a high-level
position-independent representation so that they can be manipulated
more easily. Pack file can be created but will not be compressed yet.
The index file
(used as for managing the staging area)
are fully supported. Which means that
will work as expected on a repository created by the library.
Cloning and fetching
(using various options) are fully supported for
the Git protocol, the smart-HTTP protocol and
git+ssh. A subset
of the protocol capabilities are implemented (mainly
Pushing is still experimental and needs more testing.
An abstraction for Git Store
is available. Various store implementations are available:
What is not supported
No server-side operations are currently supported.
Updates, merge and rebase are not supported. Use
Performance is comparable to the Git tool.
# #require "git.unix";; # open Lwt.Infix;; # open Git_unix;; # module Search = Git.Search.Make(FS);; # let read file = FS.create () >>= fun t -> FS.read_reference_exn t Git.Reference.master >>= fun head -> Search.find t head (`Commit (`Path file)) >>= function | None -> failwith "file not found" | Some sha -> FS.read_exn t sha >>= function | Git.Value.Blob b -> Lwt.return (Git.Blob.to_raw b) | _ -> failwith "not a valid path" ;; val read : string list -> string Lwt.t = <fun> # Lwt_main.run (read ["README.md"] >|= print_string) ocaml-git -- Git format and protocol in pure OCaml Support for on-disk and in-memory Git stores. Can read and write all the Git objects: the usual blobs, trees, commits and tags but also the pack files, pack indexes and the index file (where the staging area lives). [...]
MIT, see LICENSE.md file for its text.
with-test & >= "1.6.1"
with-test & >= "0.5.4"
with-test & >= "1.3.0"
with-test & >= "1.0.0"
>= "2.3.0" & < "3.0.0"