-
-
Save barraponto/2491147 to your computer and use it in GitHub Desktop.
#!/bin/bash | |
function actual_path() { | |
if [ [ -z "$1" ] -a [ -d $1 ] ]; then | |
echo $(cd $1 && test `pwd` = `pwd -P`) | |
return 0 | |
else | |
return 1 | |
fi | |
} | |
function is_submodule() { | |
local top_level parent_git module_name | |
if [ -d "$1" ]; then | |
cd $1 | |
else | |
return 1 | |
fi | |
# Find the root of this git repo, then check if its parent dir is also a repo | |
top_level="$(git rev-parse --show-toplevel)" | |
if [ ! actual_path $toplevel ]; then | |
top_level="$(cd $top_level && pwd -P)" | |
fi | |
module_name="$(basename "$top_level")" | |
parent_git="$(cd "$top_level/.." && git rev-parse --show-toplevel 2> /dev/null)" | |
if [[ -n $parent_git ]]; then | |
return 0 | |
else | |
return 1 | |
fi | |
} | |
function is_gitroot() { | |
if [ "$(pwd -P)" = "$(git rev-parse --show-toplevel)" ]; then | |
return 0 | |
else | |
return 1 | |
fi | |
} | |
# first check if it's a valid path | |
if [ ! -d "$1" ]; then | |
echo "Usage: git submodule rm <path>" | |
exit | |
fi | |
# then check whether we're at git root | |
if is_gitroot; then | |
# finally check whether the given path is a submodule | |
if $(is_submodule "${1}"); then | |
echo "let's remove those submodules" | |
# using ${1%/} to remove trailing slashes | |
git config -f .gitmodules --remove-section submodule.${1%/} | |
git config -f .git/config --remove-section submodule.${1%/} | |
git rm --cached ${1%/} | |
else | |
echo "git submodule rm is not recursive yet, aborting." | |
fi | |
else | |
echo "You need to run this command from the toplevel of the working tree." | |
fi |
git config is more reliable and readable than sed ;)
You can't have an alias with a space, but you can fake it with a function. Check out my fork: https://gist.github.com/2642691
My fork fixes a "bad substitution" error and says "submodule-rm" with the dash. I don't mind it :)
merged @henrik's fix :)
Is it wise to also remove the untracked submodule files (as per my fork) or is this considered dangerous?
@tlvince To my knowledge it should be safe. I suppose some instructions don't have you removing the files from your working directory because you may have made changes to the submodule that you want to keep, or something.
You should be able to do just:
git rm ${1%/}
Instead of:
git rm --cached ${1%/}
rm -rf ${1%/}
Regarding .git/modules
, I don't have any such directory in my repo (with several submodules). Maybe only older versions of Git use it? Or maybe those files are only created when you do something fancy with the modules. Either way, I suppose it's a good idea to have this script remove them. Leaving them can apparently cause problems; removing them shouldn't.
Oops, tried git rm ${1%/}
and that didn't work, even with -rf
. So both lines are needed.
@henrik I guess those files only show up if you clone and git init.
Great. I've added a test to see if .git/modules
exists and quoted the paths. Feel free to merge.
@barraponto I think I googled and then followed the link from http://stackoverflow.com/questions/1260748/how-do-i-remove-a-git-submodule
Yep, same here.
Oh, the problem is that this script doesn't work when the submodule is not at the top level of the super-module! Back to "doing it manually," I guess :-P
This one actually works: https://github.com/kollerma/git-submodule-tools/blob/master/git-rm-submodule
unfortunately, git aliases can't have spaces in it...
so I'm stuck with git submodule-rm