#!/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 |
This comment has been minimized.
This comment has been minimized.
git config is more reliable and readable than sed ;) |
This comment has been minimized.
This comment has been minimized.
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 |
This comment has been minimized.
This comment has been minimized.
My fork fixes a "bad substitution" error and says "submodule-rm" with the dash. I don't mind it :) |
This comment has been minimized.
This comment has been minimized.
merged @henrik's fix :) |
This comment has been minimized.
This comment has been minimized.
Is it wise to also remove the untracked submodule files (as per my fork) or is this considered dangerous? |
This comment has been minimized.
This comment has been minimized.
@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:
Instead of:
Regarding |
This comment has been minimized.
This comment has been minimized.
Oops, tried |
This comment has been minimized.
This comment has been minimized.
@henrik I guess those files only show up if you clone and git init. |
This comment has been minimized.
This comment has been minimized.
Great. I've added a test to see if |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
@barraponto I think I googled and then followed the link from http://stackoverflow.com/questions/1260748/how-do-i-remove-a-git-submodule |
This comment has been minimized.
This comment has been minimized.
Yep, same here. |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
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 comment has been minimized.
This comment has been minimized.
This one actually works: https://github.com/kollerma/git-submodule-tools/blob/master/git-rm-submodule |
This comment has been minimized.
unfortunately, git aliases can't have spaces in it...
so I'm stuck with git submodule-rm