As described in https://github.com/twosigma/git-meta/issues/561, when there is a tree-level conflict for a submodule, git checkout cannot resolve the problem. After running git checkout $conflicted-submodule, you get the following problem when you try to add it:

$ git add s
error: unable to index file s
fatal: updating files failed

To make matters worse, if you run git meta status, you get no indication that the submodule is conflicted.

rebase -i

Updated Apr 13, 2018

Plan

As with normal git-meta-rebase, rebase -i operates only on meta commits; it does not show information about submodule commits or allow them to be manipulated (doing so would make the command drastically more complicated and it's not even clear what it would look like).

Command overview

  • pick -- just use existing rebase logic
  • reword -- similar to pick but allow user to change commit message (see below)
  • edit -- pauses before making meta commit, does make submodule commits
  • squash -- squash meta and associated sub commits into one
  • fixup -- like squash
  • exec -- execute a command
  • drop -- similar to deleting a commit, just don't use it

Implementation notes

As long as we have a parser for the file format, we can just leave it in the meta-sequencer directory as a record of what to do with each commit.

Sample file format

pick 18c456a message

# Rebase 91e3416..18c456a onto 91e3416 (1 command)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

Sample reword file format

message

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# interactive rebase in progress; onto 91e3416
# Last command done (1 command done):
#    reword 18c456a message
# No commands remaining.
# You are currently rebasing branch 'master' on '91e3416'.
#
# Changes to be committed:
#	new file:   2
#