mirror of
https://github.com/git/git
synced 2024-10-28 19:25:47 +00:00
bisect: introduce --no-checkout support into porcelain.
git-bisect can now perform bisection of a history without performing a checkout at each stage of the bisection process. Instead, HEAD is updated. One use-case for this function is allow git bisect to be used with damaged repositories where git checkout would fail because the tree referenced by the commit is damaged. It can also be used in other cases where actual checkout of the tree is not required to progress the bisection. Improved-by: Christian Couder <chriscool@tuxfamily.org> Improved-by: Junio C Hamano <gitster@pobox.com> Improved-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Jon Seymour <jon.seymour@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
fee92fc1dd
commit
4796e823a3
1 changed files with 37 additions and 11 deletions
|
@ -3,7 +3,7 @@
|
||||||
USAGE='[help|start|bad|good|skip|next|reset|visualize|replay|log|run]'
|
USAGE='[help|start|bad|good|skip|next|reset|visualize|replay|log|run]'
|
||||||
LONG_USAGE='git bisect help
|
LONG_USAGE='git bisect help
|
||||||
print this long help message.
|
print this long help message.
|
||||||
git bisect start [<bad> [<good>...]] [--] [<pathspec>...]
|
git bisect start [--no-checkout] [<bad> [<good>...]] [--] [<pathspec>...]
|
||||||
reset bisect state and start bisection.
|
reset bisect state and start bisection.
|
||||||
git bisect bad [<rev>]
|
git bisect bad [<rev>]
|
||||||
mark <rev> a known-bad revision.
|
mark <rev> a known-bad revision.
|
||||||
|
@ -34,6 +34,16 @@ require_work_tree
|
||||||
_x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
|
_x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
|
||||||
_x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
|
_x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
|
||||||
|
|
||||||
|
bisect_head()
|
||||||
|
{
|
||||||
|
if test -f "$GIT_DIR/BISECT_HEAD"
|
||||||
|
then
|
||||||
|
echo BISECT_HEAD
|
||||||
|
else
|
||||||
|
echo HEAD
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
bisect_autostart() {
|
bisect_autostart() {
|
||||||
test -s "$GIT_DIR/BISECT_START" || {
|
test -s "$GIT_DIR/BISECT_START" || {
|
||||||
(
|
(
|
||||||
|
@ -69,6 +79,7 @@ bisect_start() {
|
||||||
orig_args=$(git rev-parse --sq-quote "$@")
|
orig_args=$(git rev-parse --sq-quote "$@")
|
||||||
bad_seen=0
|
bad_seen=0
|
||||||
eval=''
|
eval=''
|
||||||
|
mode=''
|
||||||
while [ $# -gt 0 ]; do
|
while [ $# -gt 0 ]; do
|
||||||
arg="$1"
|
arg="$1"
|
||||||
case "$arg" in
|
case "$arg" in
|
||||||
|
@ -76,6 +87,11 @@ bisect_start() {
|
||||||
shift
|
shift
|
||||||
break
|
break
|
||||||
;;
|
;;
|
||||||
|
--no-checkout)
|
||||||
|
mode=--no-checkout
|
||||||
|
shift ;;
|
||||||
|
--*)
|
||||||
|
die "$(eval_gettext "unrecognised option: '\$arg'")" ;;
|
||||||
*)
|
*)
|
||||||
rev=$(git rev-parse -q --verify "$arg^{commit}") || {
|
rev=$(git rev-parse -q --verify "$arg^{commit}") || {
|
||||||
test $has_double_dash -eq 1 &&
|
test $has_double_dash -eq 1 &&
|
||||||
|
@ -107,7 +123,10 @@ bisect_start() {
|
||||||
then
|
then
|
||||||
# Reset to the rev from where we started.
|
# Reset to the rev from where we started.
|
||||||
start_head=$(cat "$GIT_DIR/BISECT_START")
|
start_head=$(cat "$GIT_DIR/BISECT_START")
|
||||||
git checkout "$start_head" -- || exit
|
if test "z$mode" != "z--no-checkout"
|
||||||
|
then
|
||||||
|
git checkout "$start_head" --
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
# Get rev from where we start.
|
# Get rev from where we start.
|
||||||
case "$head" in
|
case "$head" in
|
||||||
|
@ -143,7 +162,10 @@ bisect_start() {
|
||||||
#
|
#
|
||||||
# Write new start state.
|
# Write new start state.
|
||||||
#
|
#
|
||||||
echo "$start_head" >"$GIT_DIR/BISECT_START" &&
|
echo "$start_head" >"$GIT_DIR/BISECT_START" && {
|
||||||
|
test "z$mode" != "z--no-checkout" ||
|
||||||
|
git update-ref --no-deref BISECT_HEAD "$start_head"
|
||||||
|
} &&
|
||||||
git rev-parse --sq-quote "$@" >"$GIT_DIR/BISECT_NAMES" &&
|
git rev-parse --sq-quote "$@" >"$GIT_DIR/BISECT_NAMES" &&
|
||||||
eval "$eval true" &&
|
eval "$eval true" &&
|
||||||
echo "git bisect start$orig_args" >>"$GIT_DIR/BISECT_LOG" || exit
|
echo "git bisect start$orig_args" >>"$GIT_DIR/BISECT_LOG" || exit
|
||||||
|
@ -206,8 +228,8 @@ bisect_state() {
|
||||||
0,*)
|
0,*)
|
||||||
die "$(gettext "Please call 'bisect_state' with at least one argument.")" ;;
|
die "$(gettext "Please call 'bisect_state' with at least one argument.")" ;;
|
||||||
1,bad|1,good|1,skip)
|
1,bad|1,good|1,skip)
|
||||||
rev=$(git rev-parse --verify HEAD) ||
|
rev=$(git rev-parse --verify $(bisect_head)) ||
|
||||||
die "$(gettext "Bad rev input: HEAD")"
|
die "$(gettext "Bad rev input: $(bisect_head)")"
|
||||||
bisect_write "$state" "$rev"
|
bisect_write "$state" "$rev"
|
||||||
check_expected_revs "$rev" ;;
|
check_expected_revs "$rev" ;;
|
||||||
2,bad|*,good|*,skip)
|
2,bad|*,good|*,skip)
|
||||||
|
@ -291,7 +313,7 @@ bisect_next() {
|
||||||
bisect_next_check good
|
bisect_next_check good
|
||||||
|
|
||||||
# Perform all bisection computation, display and checkout
|
# Perform all bisection computation, display and checkout
|
||||||
git bisect--helper --next-all
|
git bisect--helper --next-all $(test -f "$GIT_DIR/BISECT_HEAD" && echo --no-checkout)
|
||||||
res=$?
|
res=$?
|
||||||
|
|
||||||
# Check if we should exit because bisection is finished
|
# Check if we should exit because bisection is finished
|
||||||
|
@ -340,12 +362,15 @@ bisect_reset() {
|
||||||
*)
|
*)
|
||||||
usage ;;
|
usage ;;
|
||||||
esac
|
esac
|
||||||
if git checkout "$branch" -- ; then
|
if ! test -f "$GIT_DIR/BISECT_HEAD"
|
||||||
bisect_clean_state
|
then
|
||||||
else
|
if ! git checkout "$branch" --
|
||||||
die "$(eval_gettext "Could not check out original HEAD '\$branch'.
|
then
|
||||||
|
die "$(eval_gettext "Could not check out original HEAD '\$branch'.
|
||||||
Try 'git bisect reset <commit>'.")"
|
Try 'git bisect reset <commit>'.")"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
bisect_clean_state
|
||||||
}
|
}
|
||||||
|
|
||||||
bisect_clean_state() {
|
bisect_clean_state() {
|
||||||
|
@ -362,7 +387,8 @@ bisect_clean_state() {
|
||||||
rm -f "$GIT_DIR/BISECT_RUN" &&
|
rm -f "$GIT_DIR/BISECT_RUN" &&
|
||||||
# Cleanup head-name if it got left by an old version of git-bisect
|
# Cleanup head-name if it got left by an old version of git-bisect
|
||||||
rm -f "$GIT_DIR/head-name" &&
|
rm -f "$GIT_DIR/head-name" &&
|
||||||
|
git update-ref -d --no-deref BISECT_HEAD &&
|
||||||
|
# clean up BISECT_START last
|
||||||
rm -f "$GIT_DIR/BISECT_START"
|
rm -f "$GIT_DIR/BISECT_START"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue