With submodules it can be quite easy to end up with a situation where the version in the supermodule doesn't exist in the submodule. Add to the example pre-commit hook a script which checks before every commit whether the submodule commit is likely to exist at the URL defined in the .gitmodules file. Signed-off-by: Sam Vilain <sam.vilain@xxxxxxxxxxxxxxx> --- This should be useful for those using submodules. Perhaps it should also have an equivalent in the 'git submodule' command. templates/hooks--pre-commit.sample | 56 +++++++++++++++++++++++++++++++++++- 1 files changed, 55 insertions(+), 1 deletions(-) diff --git a/templates/hooks--pre-commit.sample b/templates/hooks--pre-commit.sample index 0e49279..26e7cf2 100755 --- a/templates/hooks--pre-commit.sample +++ b/templates/hooks--pre-commit.sample @@ -7,7 +7,61 @@ # # To enable this hook, rename this file to "pre-commit". -if git-rev-parse --verify HEAD 2>/dev/null +# first, check that all submodule commits are available by a remote +# which has the same URL as the one they are listed in. +if [ -n "$GIT_WORK_TREE" ] +then + cd "$GIT_WORK_TREE" +fi + +git ls-tree $(git write-tree) | grep commit | +while read mode type sha1 submodule +do + module=$(GIT_CONFIG=.gitmodules git config --list | + grep '\.path='"$submodule"\$ | + sed 's/submodule\.\([^\.]*\)\..*/\1/') + if [ -z "$module" ] + then + echo "path $submodule is a submodule, but is not" \ + "listed in .gitmodules" >&2 + exit 1 + fi + submodule_url=$(GIT_CONFIG=.gitmodules git config \ + submodule.$submodule.url) + + remotes=$(GIT_DIR=$submodule/.git git config --list | + grep '^remote\..*\.url='"$submodule_url" | + sed 's/remote\.\([^\.]*\)\..*/\1/') + + found= + for remote in $remotes + do + found=$(GIT_DIR=$submodule/.git git name-rev \ + --refs=refs/remotes/$remote/* $sha1 2>/dev/null | + grep -vw undefined) + [ -n "$found" ] && break + done + + if [ -z "$found" ] + then + echo "submodule commit does not appear under tracked remote refs" >&2 + echo " submodule = $submodule" + echo ".gitmodules = $module" + echo " url = $submodule_url" + echo " commit = $sha1" + echo " tried remotes:" $remotes + exit 2 + fi +done + +# this is the return code of the | while sub-shell above +rc=$? +if [ $rc -ne 0 ] +then + exit $rc +fi + +if git-rev-parse --verify HEAD >/dev/null 2>&1 then against=HEAD else -- 1.6.0 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html