2023-11-01 11:37:17 +00:00
|
|
|
#######################################
|
|
|
|
# git checkout interactive #
|
|
|
|
#######################################
|
|
|
|
|
|
|
|
function git-checkout-interactive() {
|
2024-02-28 10:28:36 +00:00
|
|
|
local ITEMS_TO_SHOW=10
|
2023-11-01 11:37:17 +00:00
|
|
|
# Get all branches sorted by committer date, along with their last commit hash
|
|
|
|
local branches
|
2024-02-28 10:28:36 +00:00
|
|
|
branches=$(git for-each-ref --count="$ITEMS_TO_SHOW" --sort=-committerdate --format='%(refname:short) %(objectname:short)' refs/heads/)
|
2023-11-01 11:37:17 +00:00
|
|
|
|
|
|
|
# Parse branches
|
|
|
|
local branch_list=()
|
|
|
|
local current_branch
|
|
|
|
current_branch=$(git rev-parse --abbrev-ref HEAD)
|
|
|
|
if [[ "$current_branch" == "" ]]; then
|
|
|
|
return 0
|
|
|
|
fi
|
|
|
|
while read -r branch hash; do
|
|
|
|
if [[ "$branch" == "$current_branch" ]]; then
|
|
|
|
echo "On branch $branch \n"
|
|
|
|
else
|
|
|
|
branch_list+=("$branch ($hash)")
|
|
|
|
fi
|
|
|
|
done <<< "$branches"
|
|
|
|
|
|
|
|
if (( ${#branch_list} == 0 )); then
|
|
|
|
echo "No other branches available."
|
|
|
|
return 0
|
|
|
|
else
|
|
|
|
echo "Select a branch to switch to:\n"
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Display menu
|
|
|
|
local i=1
|
|
|
|
for branch in "${branch_list[@]}"; do
|
|
|
|
echo "($i) $branch"
|
|
|
|
((i++))
|
|
|
|
done
|
|
|
|
echo -n "\nPlease enter your choice: "
|
|
|
|
|
|
|
|
# Handle user input
|
|
|
|
while :; do
|
|
|
|
local choice
|
|
|
|
read -r choice
|
|
|
|
if (( choice > 0 && choice <= ${#branch_list[@]} )); then
|
|
|
|
local selected_branch="${branch_list[$((choice))]}"
|
|
|
|
local target_branch="${selected_branch//->}"
|
|
|
|
target_branch="${target_branch%% *}"
|
|
|
|
git checkout "$target_branch"
|
|
|
|
break
|
|
|
|
else
|
|
|
|
break
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
|
|
|
alias gci="git-checkout-interactive || return 0"
|