Browse Source

Enable ref log creation in git checkout -b.

Switch git checkout -b to use git-update-ref rather than echo and
a shell I/O redirection.  This is more in line with typical GIT
commands and allows -b to be logged according to the normal ref
logging rules.

Added -l option to allow users to create the ref log at the same
time as creating a branch.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
maint
Shawn Pearce 19 years ago committed by Junio C Hamano
parent
commit
969d326d6b
  1. 7
      Documentation/git-checkout.txt
  2. 19
      git-checkout.sh

7
Documentation/git-checkout.txt

@ -8,7 +8,7 @@ git-checkout - Checkout and switch to a branch
SYNOPSIS SYNOPSIS
-------- --------
[verse] [verse]
'git-checkout' [-f] [-b <new_branch>] [-m] [<branch>] 'git-checkout' [-f] [-b <new_branch> [-l]] [-m] [<branch>]
'git-checkout' [-m] [<branch>] <paths>... 'git-checkout' [-m] [<branch>] <paths>...


DESCRIPTION DESCRIPTION
@ -37,6 +37,11 @@ OPTIONS
-b:: -b::
Create a new branch and start it at <branch>. Create a new branch and start it at <branch>.


-l::
Create the new branch's ref log. This activates recording of
all changes to made the branch ref, enabling use of date
based sha1 expressions such as "<branchname>@{yesterday}".

-m:: -m::
If you have local modifications to one or more files that If you have local modifications to one or more files that
are different between the current branch and the branch to are different between the current branch and the branch to

19
git-checkout.sh

@ -5,10 +5,13 @@ SUBDIRECTORY_OK=Sometimes
. git-sh-setup . git-sh-setup


old=$(git-rev-parse HEAD) old=$(git-rev-parse HEAD)
old_name=HEAD
new= new=
new_name=
force= force=
branch= branch=
newbranch= newbranch=
newbranch_log=
merge= merge=
while [ "$#" != "0" ]; do while [ "$#" != "0" ]; do
arg="$1" arg="$1"
@ -24,6 +27,9 @@ while [ "$#" != "0" ]; do
git-check-ref-format "heads/$newbranch" || git-check-ref-format "heads/$newbranch" ||
die "git checkout: we do not like '$newbranch' as a branch name." die "git checkout: we do not like '$newbranch' as a branch name."
;; ;;
"-l")
newbranch_log=1
;;
"-f") "-f")
force=1 force=1
;; ;;
@ -44,6 +50,7 @@ while [ "$#" != "0" ]; do
exit 1 exit 1
fi fi
new="$rev" new="$rev"
new_name="$arg^0"
if [ -f "$GIT_DIR/refs/heads/$arg" ]; then if [ -f "$GIT_DIR/refs/heads/$arg" ]; then
branch="$arg" branch="$arg"
fi fi
@ -51,9 +58,11 @@ while [ "$#" != "0" ]; do
then then
# checking out selected paths from a tree-ish. # checking out selected paths from a tree-ish.
new="$rev" new="$rev"
new_name="$arg^{tree}"
branch= branch=
else else
new= new=
new_name=
branch= branch=
set x "$arg" "$@" set x "$arg" "$@"
shift shift
@ -114,7 +123,7 @@ then
cd "$cdup" cd "$cdup"
fi fi


[ -z "$new" ] && new=$old [ -z "$new" ] && new=$old && new_name="$old_name"


# If we don't have an old branch that we're switching to, # If we don't have an old branch that we're switching to,
# and we don't have a new branch name for the target we # and we don't have a new branch name for the target we
@ -187,9 +196,11 @@ fi
# #
if [ "$?" -eq 0 ]; then if [ "$?" -eq 0 ]; then
if [ "$newbranch" ]; then if [ "$newbranch" ]; then
leading=`expr "refs/heads/$newbranch" : '\(.*\)/'` && if [ "$newbranch_log" ]; then
mkdir -p "$GIT_DIR/$leading" && mkdir -p $(dirname "$GIT_DIR/logs/refs/heads/$branchname")
echo $new >"$GIT_DIR/refs/heads/$newbranch" || exit touch "$GIT_DIR/logs/refs/heads/$branchname"
fi
git-update-ref -m "checkout: Created from $new_name" "refs/heads/$newbranch" $new || exit
branch="$newbranch" branch="$newbranch"
fi fi
[ "$branch" ] && [ "$branch" ] &&

Loading…
Cancel
Save