1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
{0 How-To's}
Using an autoformatter will make your process easier but it can also introduce a few pain points. Here are how to solve the most commonly encountered pain points.
{1 Using OCamlFormat without breaking [git blame]}
- Create [.git-blame-ignore-revs] in your project
- Add revision(s) where the code was re-formatted
{[
# Apply new formatting with OCamlFormat
2ceaf76b9f84cb632327c1479d0f30acfa3eeba2
]}
- Run [git config --local blame.ignoreRevsFile .git-blame-ignore-revs]
- All future use of [git blame] will now provide blame information omitting the reformatting commits: lines that were changed or added by an ignored commit will be blamed on the previous commit that changed that line or nearby lines.
{1 Resolve merge conflicts using Merge-fmt and OCamlFormat}
{{:https://github.com/hhugo/merge-fmt}Merge-fmt} is a small wrapper on top of [git] commands to help resolve conflicts caused by code formatters.
There are three ways to use [merge-fmt].
{2 Standalone}
Just call [merge-fmt] while there are unresolved conflicts. [merge-fmt] will try to
resolve conflicts automatically.
{2 As a Git mergetool}
[merge-fmt] can act as a git {{:https://git-scm.com/docs/git-mergetool}mergetool}.
First configure the current git repository with
{[
merge-fmt setup-mergetool
git config --local mergetool.mergefmt.cmd 'merge-fmt mergetool --base=$BASE --current=$LOCAL --other=$REMOTE -o $MERGED'
git config --local mergetool.mergefmt.trustExitCode true
]}
Then, use [git mergetool] to resolve conflicts with [git mergetool -t mergefmt].
{2 As a git merge driver}
[merge-fmt] can act as a git {{:https://git-scm.com/docs/gitattributes}merge driver}.
Configure the current git repository to use [merge-fmt] as the default merge driver.
{[
$ merge-fmt setup-merge
git config --local merge.mergefmt.name 'merge-fmt driver'
git config --local merge.mergefmt.driver 'merge-fmt mergetool --base=%O --current=%A --other=%B -o %A --name=%P'
git config --local merge.tool 'mergefmt'
git config --local merge.default 'mergefmt'
]}
|