'gcd' : Git-Aware 'cd' Relative to Repository Root with Auto-Completion
The following will enable you to have a Git-aware "cd" command with directory path expansion/auto-completion relative to the repository root. You will have to source it into your "~/.bashrc" file, after which invoking "gcd" from the shell will allow you specify directory paths relative to the root of your Git repository no matter where you are within the working tree.
gcd() {
if [[ $(which git 2> /dev/null) ]]
then
STATUS=$(git status 2>/dev/null)
if [[ -z $STATUS ]]
then
return
fi
TARGET="./$(git rev-parse --show-cdup)$1"
#echo $TARGET
cd $TARGET
fi
}
_gcd()
{
if [[ $(which git 2> /dev/null) ]]
then
STATUS=$(git status 2>/dev/null)
if [[ -z $STATUS ]]
then
return
fi
TARGET="./$(git rev-parse --show-cdup)"
if [[ -d $TARGET ]]
then
TARGET="$TARGET/"
fi
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}$2"
dirnames=$(cd $TARGET; compgen -o dirnames $2)
opts=$(for i in $dirnames; do if [[ $i != ".git" ]]; then echo $i/; fi; done)
if [[ ${cur} == * ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
fi
}
complete -o nospace -F _gcd gcd
if [[ $(which git 2> /dev/null) ]]
then
STATUS=$(git status 2>/dev/null)
if [[ -z $STATUS ]]
then
return
fi
TARGET="./$(git rev-parse --show-cdup)$1"
#echo $TARGET
cd $TARGET
fi
}
_gcd()
{
if [[ $(which git 2> /dev/null) ]]
then
STATUS=$(git status 2>/dev/null)
if [[ -z $STATUS ]]
then
return
fi
TARGET="./$(git rev-parse --show-cdup)"
if [[ -d $TARGET ]]
then
TARGET="$TARGET/"
fi
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}$2"
dirnames=$(cd $TARGET; compgen -o dirnames $2)
opts=$(for i in $dirnames; do if [[ $i != ".git" ]]; then echo $i/; fi; done)
if [[ ${cur} == * ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
fi
}
complete -o nospace -F _gcd gcd
feed