X-Git-Url: https://git.madduck.net/etc/vim.git/blobdiff_plain/97060a4f18341cdd7deb908cfd6bcf0fd7f302c8..f62f1ddc2fee683aeae55d1fea71fee77184cd2d:/README.md diff --git a/README.md b/README.md index 405eae6..3baffd3 100644 --- a/README.md +++ b/README.md @@ -150,6 +150,50 @@ should be configured to neither warn about nor overwrite _Black_'s changes. Actual details on _Black_ compatible configurations for various tools can be found in [compatible_configs](https://github.com/psf/black/blob/master/docs/compatible_configs.md). +### Migrating your code style without ruining git blame + +A long-standing argument against moving to automated code formatters like _Black_ is +that the migration will clutter up the output of `git blame`. This was a valid argument, +but since Git version 2.23, Git natively supports +[ignoring revisions in blame](https://git-scm.com/docs/git-blame#Documentation/git-blame.txt---ignore-revltrevgt) +with the `--ignore-rev` option. You can also pass a file listing the revisions to ignore +using the `--ignore-revs-file` option. The changes made by the revision will be ignored +when assigning blame. Lines modified by an ignored revision will be blamed on the +previous revision that modified those lines. + +So when migrating your project's code style to _Black_, reformat everything and commit +the changes (preferably in one massive commit). Then put the full 40 characters commit +identifier(s) into a file. + +``` +# Migrate code style to Black +5b4ab991dede475d393e9d69ec388fd6bd949699 +``` + +Afterwards, you can pass that file to `git blame` and see clean and meaningful blame +information. + +```console +$ git blame important.py --ignore-revs-file .git-blame-ignore-revs +7a1ae265 (John Smith 2019-04-15 15:55:13 -0400 1) def very_important_function(text, file): +abdfd8b0 (Alice Doe 2019-09-23 11:39:32 -0400 2) text = text.lstrip() +7a1ae265 (John Smith 2019-04-15 15:55:13 -0400 3) with open(file, "r+") as f: +7a1ae265 (John Smith 2019-04-15 15:55:13 -0400 4) f.write(formatted) +``` + +You can even configure `git` to automatically ignore revisions listed in a file on every +call to `git blame`. + +```console +$ git config blame.ignoreRevsFile .git-blame-ignore-revs +``` + +**The one caveat is that GitHub and GitLab do not yet support ignoring revisions using +their native UI of blame.** So blame information will be cluttered with a reformatting +commit on those platforms. (If you'd like this feature, there's an open issue for +[GitLab](https://gitlab.com/gitlab-org/gitlab/-/issues/31423) and please let GitHub +know!) + ### NOTE: This is a beta product _Black_ is already [successfully used](#used-by) by many projects, small and big. It @@ -1097,7 +1141,7 @@ for your project. See _Black_'s own example. If you're already using Python 3.7, switch the `language_version` accordingly. Finally, -`stable` is a tag that is pinned to the latest release on PyPI. If you'd rather run on +`stable` is a branch that tracks the latest release on PyPI. If you'd rather run on master, this is also an option. ## Ignoring unmodified files