Normally when I commit a change to a submodule in Git (and if that's the only change), I will provide the result of git diff <submodule-name> to the body of the commit message (with diff.submodule set to log in my git config). So the message would look something like:

Updated Core Submodule

Submodule Core eaedd3f..0721763:
  < Fixed ZA-123: Crash in rendering module
  < Merge 'develop' into 'master'

I've been trying to write a script that will automate this, to which I can tie to an alias in my git config. To generate the text above, ideally I'd like to run a command such as:

$ git submodule-commit Core

This would perform the following (roughly):

  1. Stage any change to specified submodule (Core in this case)
  2. Diff the change to the submodule and store that output text for the message generated later
  3. Run git commit and provide the subject line (Updated $1 Submodule, or something of that sort, where $1 is Core in this example).
  4. Add the stored diff result from earlier to the commit message as well

I've not had any luck writing a simple script for this. I'm not very experienced with bash / shell scripts. Could anyone help provide an implementation that accomplishes this?

  • You could start with the --oneline option for git log. – saiarcot895 Jun 28 '15 at 16:12
  • 1
    Running git log --oneline eaedd3f..0721763 | sed 's,^, < ,' will give you the submodule commits formatted as above (but with the short commit ID included), given the range of commits to include. – saiarcot895 Jun 28 '15 at 16:22
  • That's the easy part. How to pipe that into git commit with a prepended subject text plus 2 newlines is what I can't figure out. – void.pointer Jun 28 '15 at 17:16

The key bit of syntax you're missing here is:

git commit -m "$(printf "Updated $submodule Submodule\n\n" ; git diff $submodule)"

The use of the $() form of command substitution inside double quotes sends the output of git diff... to git commit as a commit message with newlines intact.

I used printf here instead of echo to prepend the subject line since for anything even slightly complex — like dealing with embedded escapes — echo is basically nonportable, for historical reasons.

The rest of the script is left as an exercise to the student. :)

  • Again your solution is simple. If that's all I had to do, I wouldn't have posted here to begin with. You've conveniently left out what I feel is the most difficult part to solve: The string concatenation of subject line + 2 line feeds + result of git diff $submodule. – void.pointer Jun 28 '15 at 18:39
  • @void.pointer: Added the header line. I didn't know it wasn't part of "git diff" output. – Warren Young Jun 28 '15 at 19:04
  • Wow much better answer! Thanks for editing. Honestly, I wasn't expecting it to be so simple. I thought I would have to do some crazy awk stuff and piping. – void.pointer Jun 29 '15 at 1:19

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.