添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

I totally obsess over commit messages. I often spend minutes staring into space trying to come up with the best way to summarize the changes a commit brings. I religiously follow the seven rules of good commit messages . As you might have guessed, I've spent some time developing a workflow for writing commit messages.

I use Sublime Text 3 for most of my text-editing needs. I've also set it as my core editor.

git config --global core.editor "subl -n -w"
    Enter fullscreen mode
    Exit fullscreen mode

Note: The above requires the you to install the subl command if it doesn't work out of the box. Installation instructions: macOS · Linux · Windows.

Earlier, I used to use a package to provide syntax highlighting for commit messsages. However, build 3170 has brought native support for various git formats, commit message included.

Sublime allows you to override settings for specific syntaxes. You can edit these from ‹Preferences› → ‹Settings – Syntax Specific›. Here's my Git Commit.sublime-settings file:
"rulers": [50, 72], "spell_check": true, "word_wrap": "true", "wrap_width": 72, "font_size": 14, "draw_centered": true Enter fullscreen mode Exit fullscreen mode

This template makes it easier to frame commits in accordance with the seven rules I mentioned earlier. I can't seem to remember where I found this, but in my attempts to trace it, I found a blog post providing a very similar template. As it turns out, git allows you to use a text file as a template for your commit messages.

git config --global commit.template "/Users/example/dotfiles/commit-msg-template"
    Enter fullscreen mode
    Exit fullscreen mode

Edit: This snippet originally used perl followed by grep. Thanks @shaiay and @jwmevans_77's for your suggestions in the comments.

Make sure the hook is set to be executable with chmod +x. Now that pesky help notice will bother you no more.

Recently, I found this really cool utility which allows you to validate commit messages from the command line. I use a modified form of the utility in a global commit-msg hook to automatically validate every commit I make. Create commit-msg in your global git hooks directory:

#!/usr/bin/env bash
commit-msg file $1
    Enter fullscreen mode
    Exit fullscreen mode

Note: The above requires the commit-msg command to be on your $PATH. Install it using npm i -g commit-msg manually from source code.

Again, make sure the script is set to be executable. The result of this hook is that the commit would abort if my commit message does not meet the criteria.

Thanks for reading!

  • Tim Pope's note about commit messages
  • Commit guideline suggestions from Pro Git
  • Linus Torvald's note about commit messages
  • Commit message formatting guidelines from the Spring Project
  • I tried this out and it almost worked except grep doesn't allow you to edit a file in-place. So I tried grep -Ev "(# Please.*|# with.*|^#$)" $1 > $1 but that didn't work.

    Eventually, the following worked:

    grep -Ev "(# Please.*|# with.*|^#$)" $1 > /tmp/msg
    cat /tmp/msg > $1
    

    According to SO this is really a limitation of UNIX. The best answer I found there is (stackoverflow.com/a/29735702/5863381)

    but really your solution is just fine. You can add some error checking (and make it into a one-liner):
    grep -Ev .... %1 > /tmp/msg && cat /tmp/msg > $1
    (this way the cat will only execute if the grep didn't produce an error)

    You could do the following:
    sed -i '/\(# Please.*\|# with.*\|^#$\)/ d' $1
    The -i flag will do the edits in-place, saving you having to create a temp file.
    Assuming that the unwanted block always occurs at the same place, you could also do sed -i '/^# Please/,+2 d' $1 (Which will delete the line starting with "# Please" and the next 2 lines as well)

    **Just noticed a typo in the second sed statement - There was a missing "/" (fixed now)

    Great idea. I'll update the article to use this.

    Edit: I just tried this on macOS and it errors out with sed: 1: ".git/COMMIT_EDITMSG": invalid command code .. With some searching, I learnt that BSD sed (the one that macOS uses) requires an extension with -i. However, even that gives me sed: 1: "/^# Please/,+2 d": expected context address. Apparently the +2 thing is GNU sed specific. The first statement (with -i.bak) didn't error, but didn't remove the lines either. I'm guessing it's because of inconsistencies in implementations of sed.

    Does the other sed command work for you (sed -i.bak '/\(# Please.*\|# with.*\|^#$\)/ d' $1)?
    You can also try this one: sed -i.bak '/^# Please/,/^#$/ d' $1

    To keep things tidy you could make it sed -i.bak '/^# Please/,/^#$/ d' $1 && rm $1.bak

    Great! In case someone else needs it;
    For the cursor on the first line thing on VS Code
    [core]
    editor = \"C:\\[yourPath]\\Code.exe\" -g $1:1 --wait

    in .gitconfig seems to do the trick.

    -VSCode's CLI opts

    Brilliant stuff! By the way, have you ever tried the GitSavvy plugin? If you did, why did you stop ? If you didn't, please try it out and let me know what you think !

    Disclaimer: I occasionally contribute to GitSavvy

    Also, I'd like to update your examples to use conventionalcommits.org/

    # Explain why this change is being made # Provide links to any relevant tickets, articles or other resources Resolves issue #4

    Built on Forem — the open source software that powers DEV and other inclusive communities.

    Made with love and Ruby on Rails. DEV Community © 2016 - 2024.