git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 3/5] bisect: introduce --no-checkout[=<ref>] support into porcelain.

From
Jon Seymour <jon.seymour@gmail.com>
Date
Jul 30, 2011, 08:28 UTC
Message-ID
<1312014511-7157-4-git-send-email-jon.seymour@gmail.com>
In-Reply-To
<1312014511-7157-1-git-send-email-jon.seymour@gmail.com>

git-bisect can now perform bisection of a history without performing a checkout at each stage of the bisection process.

Instead, the reference specified by <ref> is updated. If <ref> is not specified, HEAD is used instead.

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.

Signed-off-by: Jon Seymour <jon.seymour@gmail.com>
---
 git-bisect.sh |   45 ++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 38 insertions(+), 7 deletions(-)
diff --git a/git-bisect.sh b/git-bisect.sh
index b2186a8..6c4e853 100755
--- a/git-bisect.sh
+++ b/git-bisect.sh
@@ -3,7 +3,7 @@
 USAGE='[help|start|bad|good|skip|next|reset|visualize|replay|log|run]'
 LONG_USAGE='git bisect help
         print this long help message.
-git bisect start [<bad> [<good>...]] [--] [<pathspec>...]
+git bisect start [--no=checkout[=<ref>]] [<bad> [<good>...]] [--] [<pathspec>...]
         reset bisect state and start bisection.
 git bisect bad [<rev>]
         mark <rev> a known-bad revision.
@@ -34,6 +34,8 @@ require_work_tree
 _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"
 
+BISECT_NOCHECKOUT=$(test -f "${GIT_DIR}/BISECT_NOCHECKOUT" && cat "${GIT_DIR}/BISECT_NOCHECKOUT")
+
 bisect_autostart() {
 	test -s "$GIT_DIR/BISECT_START" || {
 		(
@@ -59,6 +61,18 @@ bisect_autostart() {
 }
 
 bisect_start() {
+	BISECT_NOCHECKOUT=
+	for arg in "$@"; do
+		case "$arg" in
+		--no-checkout)
+			BISECT_NOCHECKOUT=--no-checkout=HEAD ;;
+		--no-checkout=*)
+			BISECT_NOCHECKOUT=$arg ;;
+		--)
+			break; ;;
+		esac
+	done
+
 	#
 	# Verify HEAD.
 	#
@@ -74,7 +88,11 @@ bisect_start() {
 	then
 		# Reset to the rev from where we started.
 		start_head=$(cat "$GIT_DIR/BISECT_START")
-		git checkout "$start_head" -- || exit
+		if test -z "${BISECT_NOCHECKOUT}"; then
+		    git checkout "$start_head" --
+		else
+		    git update-ref --no-deref "${BISECT_NOCHECKOUT#--no-checkout=}" "$start_head"
+		fi
 	else
 		# Get rev from where we start.
 		case "$head" in
@@ -114,6 +132,13 @@ bisect_start() {
 		shift
 		break
 		;;
+	    --no-checkout*)
+		echo "${BISECT_NOCHECKOUT}" > "$GIT_DIR/BISECT_NOCHECKOUT"
+		shift
+		;;
+	    --*)
+		die "unrecognised option: $arg"
+		;;
 	    *)
 		rev=$(git rev-parse -q --verify "$arg^{commit}") || {
 		    test $has_double_dash -eq 1 &&
@@ -291,7 +316,7 @@ bisect_next() {
 	bisect_next_check good
 
 	# Perform all bisection computation, display and checkout
-	git bisect--helper --next-all
+	git bisect--helper --next-all "${BISECT_NOCHECKOUT}"
 	res=$?
 
         # Check if we should exit because bisection is finished
@@ -340,11 +365,16 @@ bisect_reset() {
 	*)
 	    usage ;;
 	esac
-	if git checkout "$branch" -- ; then
-		bisect_clean_state
-	else
-		die "$(eval_gettext "Could not check out original HEAD '\$branch'.
+	if test -z "${BISECT_NOCHECKOUT}"; then
+		if git checkout "$branch" --; then
+			bisect_clean_state
+		else
+			die "$(eval_gettext "Could not check out original HEAD '\$branch'.
 Try 'git bisect reset <commit>'.")"
+		fi
+	else
+	    ref=${BISECT_NOCHECKOUT#--no-checkout=}
+	    git symbolic-ref "$ref" $(git rev-parse --symbolic-full-name "${branch}")
 	fi
 }
 
@@ -360,6 +390,7 @@ bisect_clean_state() {
 	rm -f "$GIT_DIR/BISECT_LOG" &&
 	rm -f "$GIT_DIR/BISECT_NAMES" &&
 	rm -f "$GIT_DIR/BISECT_RUN" &&
+	rm -f "$GIT_DIR/BISECT_NOCHECKOUT" &&
 	# Cleanup head-name if it got left by an old version of git-bisect
 	rm -f "$GIT_DIR/head-name" &&
 
-- 
1.7.6.387.g991c2
Previous: Christian CouderNext: Christian Couder
Message 5 of 26 in “bisect: Add support for a --no-checkout option.”
  1. 0/5 bisect: Add support for a --no-checkout option.Jon Seymour, Jul 30, 2011
  2. 1/5 bisect: add tests to document expected behaviour in presence of broken trees.Jon Seymour, Jul 30, 2011
  3. 2/5 bisect: introduce support for --no-checkout=<ref> option.Jon Seymour, Jul 30, 2011
  4. Christian CouderJul 30, 2011
  5. 3/5 bisect: introduce --no-checkout[=<ref>] support into porcelain.Jon Seymour, Jul 30, 2011
  6. Christian CouderJul 30, 2011
  7. Jon SeymourJul 30, 2011
  8. Christian CouderJul 31, 2011
  9. Junio C HamanoAug 1, 2011
  10. Christian CouderAug 1, 2011
  11. 4/5 bisect: add tests for the --no-checkout option.Jon Seymour, Jul 30, 2011
  12. 5/5 bisect: add documentation for --no-checkout[=<ref>] option.Jon Seymour, Jul 30, 2011
  13. Jon SeymourJul 30, 2011
  14. Christian CouderJul 30, 2011
  15. Jon SeymourJul 30, 2011
  16. Christian CouderJul 30, 2011
  17. Junio C HamanoAug 1, 2011
  18. Christian CouderAug 1, 2011
  19. Jon SeymourAug 1, 2011
  20. Junio C HamanoAug 1, 2011
  21. Jon SeymourAug 1, 2011
  22. Junio C HamanoAug 1, 2011
  23. Jon SeymourAug 2, 2011
  24. Jon SeymourAug 2, 2011
  25. Junio C HamanoAug 2, 2011
  26. Jon SeymourAug 2, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.