tj.git-extras/bin/git-delete-submodule
2019-11-02 04:32:36 -04:00

47 lines
1.5 KiB
Bash
Executable file

#!/usr/bin/env bash
abort() {
error="$1" && shift
echo "ERROR: $*" 1>&2
test -z "$FORCE" && exit "$error"
}
# Don't abort on failures. This allows to cleanup after a rpevious failure.
[ "$1" = '--force' ] && FORCE=1 && shift
test -z "$1" && abort 1 'Submodule required'
cd "$(git root)" || abort 5 'Cannot change to repository root'
test ! -f '.gitmodules' && abort 2 '.gitmodules file not found'
NAME="${1%/}"
test -z "$(git config --file='.gitmodules' "submodule.$NAME.url")" \
&& abort 3 'Submodule not found'
# 1. Handle the .git directory
# 1.a. Delete the relevant section from .git/config
git submodule deinit -f "$NAME" || abort 4 "Failed to deinitialize $NAME"
# 1.b. Delete the submodule .git directory
rm -rf ".git/modules/$NAME"
# 1.c. Delete empty submodule directory
git rm -f "$NAME"
# 2. Handle .gitignore file
# 2.a. Delete the relevant line from .gitmodules
git config --file='.gitmodules' --remove-section "submodule.$NAME"
# 2.b and stage changes
git add '.gitmodules'
# 2.c. Delete empty .gitmodules
[ "$(wc -l '.gitmodules' | cut -d' ' -f1)" = '0' ] && git rm -f '.gitmodules'
# 3. Need to confirm and commit the changes for yourself
if git submodule status >/dev/null 2>&1 \
&& ! git submodule status | grep "$NAME"; then
echo "Successfully deleted $NAME."
else
abort 6 "Failed to delete $NAME."
fi
echo
git submodule status
echo 'Confirm the output of `git submodule status` above' \
' and commit the changes for yourself.'