git-fmt: Custom git command for formatting code.

[ bsd3, development, program ] [ Propose Tags ]

git-fmt adds a custom command to Git that automatically formats code by using external pretty-printers. The idea was taken from gofmt, just with a bit of expansion to more languages.

[Skip to Readme]
Versions [faq],,,,,,,,,,,,,,,,,,,,,,
Change log
Dependencies aeson (>=0.8 && <0.10), base (==4.8.*), directory (==1.2.*), exceptions (==0.8.*), extra (==1.4.*), fast-logger (==2.4.*), filepath (==1.4.*), git-fmt, monad-logger (==0.3.*), monad-parallel (==0.7.*), mtl (==2.2.*), optparse-applicative (==0.11.*), process (==1.2.*), temporary (==1.2.*), text (==1.2.*), time (==1.5.*), transformers (==0.4.*), unordered-containers (==0.2.*), yaml (==0.8.*) [details]
License BSD-3-Clause
Author Henry J. Wylde
Category Development
Home page
Source repo head: git clone
Uploaded by hjwylde at Wed Dec 9 10:38:47 UTC 2015
Distributions NixOS:
Executables git-fmt
Downloads 7186 total (202 in the last 30 days)
Rating (no votes yet) [estimated by rule of succession]
Your Rating
  • λ
  • λ
  • λ
Status Hackage Matrix CI
Docs available [build log]
Last success reported on 2015-12-09 [all 1 reports]




Maintainer's Corner

For package maintainers and hackage trustees

Readme for git-fmt-

[back to package description]


Project Status: Wip - Initial development is in progress, but there has not yet been a stable, usable release suitable for the public. Build Status Release

(Side note: the formatting component of this project will eventually be split out and named omnifmt.)

git-fmt was created to make prettifying code easy. It adds a custom (easy to use) command to Git that formats code through external pretty-printers.

Formatted code is:

  • Easier to write: never worry about minor formatting concerns while hacking away.
  • Easier to read: when all code looks the same you need not mentally convert others' formatting style into something you can understand.
  • Easier to maintain: mechanical changes to the source don't cause unrelated changes to the file's formatting; diffs show only the real changes.
  • Uncontroversial: never have a debate about spacing or brace position ever again.

(Bullet points taken from


Installing git-fmt is easiest done using either stack (recommended) or Cabal.

Using stack:

stack install git-fmt
export PATH=$PATH:~/.local/bin

Using Cabal:

cabal-install git-fmt
export PATH=$PATH:~/.cabal/bin


The git-fmt binary wraps external pretty-printers and provides an interface for selecting files to prettify and performing dry-runs. Rather than repeating it here, have a read of git fmt -h for how to call it.


Configuration is done via an .omnifmt.yaml file in the git repository. The file contains a list of programs that link extensions to a prettifying command, e.g.,

    extensions: ["hs", "lhs"]
    command:    "stylish-haskell {{input}} > {{output}}"

    extensions: ["js"]
    command:    "js-beautify -f {{input}}"

    extensions: ["json"]
    command:    "json_pp"

    extensions: ["rb"]
    command:    "ruby-beautify"

Each command declares how to read the input file and how to write to the output file. If the input variable is omitted, the file contents are fed to the command through stdin. Likewise if the output variable is omitted, the pretty contents are read from stdout. The output file is used to compare whether the original was pretty or ugly before writing to it.

The extensions field is pretty self explanatory, but if you use the same extension more than once then precedence goes to the program defined first.


See the docs/example-configs/ directory for some common pretty-printers and their corresponding omnifmt config. Just don't forget to actually call the config file .omnifmt.yaml!

NB: I haven't tested them fully, be careful in case one is buggy.