diff --git a/modules/git/alias.zsh b/modules/git/alias.zsh index d5945553..b87baa0e 100644 --- a/modules/git/alias.zsh +++ b/modules/git/alias.zsh @@ -136,9 +136,11 @@ alias gSa='git submodule add' alias gSf='git submodule foreach' alias gSi='git submodule init' alias gSl='git submodule status' +alias gSm='git-submodule-move' alias gSs='git submodule sync' alias gSu='git submodule update --init --recursive' alias gSU='git submodule foreach git pull origin master' +alias gSx='git-submodule-remove' # Working Copy (w) alias gws='git status --short' diff --git a/modules/git/functions/git-submodule-move b/modules/git/functions/git-submodule-move new file mode 100644 index 00000000..4c94ed25 --- /dev/null +++ b/modules/git/functions/git-submodule-move @@ -0,0 +1,30 @@ +# +# Moves a Git submodule. +# +# Authors: +# Sorin Ionescu +# + +local src="$1" +local dst="$2" +local url + +if [[ "$PWD" != "$(git-root)" ]]; then + print "$0: must be run from the root of the working tree" >&2 + return 1 +fi + +url="$(git config --file "$(git-root)/.gitmodules" --get "submodule.${src}.url")" + +if [[ -z "$url" ]]; then + print "$0: submodule not found: $src" >&2 + return 1 +fi + +mkdir -p "${dst:h}" + +git-submodule-remove "$src" +git submodule add "$url" "$dst" + +return 0 + diff --git a/modules/git/functions/git-submodule-remove b/modules/git/functions/git-submodule-remove new file mode 100644 index 00000000..26fca233 --- /dev/null +++ b/modules/git/functions/git-submodule-remove @@ -0,0 +1,27 @@ +# +# Removes a Git submodule. +# +# Authors: +# Sorin Ionescu +# + +if [[ "$PWD" != "$(git-root)" ]]; then + print "$0: must be run from the root of the working tree" >&2 + return 1 +fi + +if ! git config --file .gitmodules --get "submodule.${1}.path" &>/dev/null; then + print "$0: submodule not found: $1" >&2 + return 1 +fi + +git config --file "$(git-dir)/config" --remove-section "submodule.${1}" &>/dev/null +git config --file "$(git-root)/.gitmodules" --remove-section "submodule.${1}" &>/dev/null +git add .gitmodules + +git rm --cached -rf "${1}" +rm -rf "${1}" +rm -rf "$(git-dir)/modules/${1}" + +return 0 +