diff options
author | Junio C Hamano <junkio@cox.net> | 2005-09-14 01:43:53 -0700 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2005-09-15 12:46:30 -0700 |
commit | ba65af9c1f67461c0dfa6582c911d6a893d80284 (patch) | |
tree | bbaa5ec3c00ef0a51acc6a5c454e2c8159d071b2 /git-branch.sh | |
parent | 19397b4521bcc27eb224413fb71519223b94290f (diff) | |
download | git-ba65af9c1f67461c0dfa6582c911d6a893d80284.tar.gz git-ba65af9c1f67461c0dfa6582c911d6a893d80284.tar.xz |
git-branch -d <branch>: delete unused branch.
The new flag '-d' lets you delete a branch. For safety, it does not
lets you delete the branch you are currently on, nor a branch that
has been fully merged into your current branch.
The credit for the safety check idea goes to Daniel Barkalow.
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'git-branch.sh')
-rwxr-xr-x | git-branch.sh | 60 |
1 files changed, 54 insertions, 6 deletions
diff --git a/git-branch.sh b/git-branch.sh index 81b9e6cce..dcec2a9f2 100755 --- a/git-branch.sh +++ b/git-branch.sh @@ -3,7 +3,7 @@ . git-sh-setup || die "Not a git archive" usage () { - echo >&2 "usage: $(basename $0)"' [<branchname> [start-point]] + echo >&2 "usage: $(basename $0)"' [-d <branch>] | [<branch> [start-point]] If no arguments, show available branches and mark current branch with a star. If one argument, create a new branch <branchname> based off of current HEAD. @@ -12,6 +12,59 @@ If two arguments, create a new branch <branchname> based off of <start-point>. exit 1 } +delete_branch () { + option="$1" branch_name="$2" + headref=$(readlink "$GIT_DIR/HEAD" | sed -e 's|^refs/heads/||') + case ",$headref," in + ",$branch_name,") + die "Cannot delete the branch you are on." ;; + ,,) + die "What branch are you on anyway?" ;; + esac + branch=$(cat "$GIT_DIR/refs/heads/$branch_name") && + branch=$(git-rev-parse --verify "$branch^0") || + die "Seriously, what branch are you talking about?" + case "$option" in + -D) + ;; + *) + mbs=$(git-merge-base -a "$branch" HEAD | tr '\012' ' ') + case " $mbs " in + *' '$branch' '*) + # the merge base of branch and HEAD contains branch -- + # which means that the HEAD contains everything in the HEAD. + ;; + *) + echo >&2 "The branch '$branch_name' is not a strict subset of your current HEAD. +If you are sure you want to delete it, run 'git branch -D $branch_name'." + exit 1 + ;; + esac + ;; + esac + rm -f "$GIT_DIR/refs/heads/$branch_name" + echo "Deleted branch $branch_name." + exit 0 +} + +while case "$#,$1" in 0,*) break ;; *,-*) ;; *) break ;; esac +do + case "$1" in + -d | -D) + delete_branch "$1" "$2" + exit + ;; + --) + shift + break + ;; + -*) + usage + ;; + esac + shift +done + case "$#" in 0) headref=$(readlink "$GIT_DIR/HEAD" | sed -e 's|^refs/heads/||') @@ -36,11 +89,6 @@ case "$#" in esac branchname="$1" -case "$branchname" in --*) - usage;; -esac - rev=$(git-rev-parse --verify "$head") || exit [ -e "$GIT_DIR/refs/heads/$branchname" ] && die "$branchname already exists" |