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

[PATCH v3 10/11] contrib: remove "git-new-workdir"

From
Patrick Steinhardt <ps@pks.im>
Date
May 12, 2025, 09:20 UTC
Message-ID
<20250512-pks-contrib-spring-cleanup-v3-10-32e151b0bfb0@pks.im>
In-Reply-To
<20250512-pks-contrib-spring-cleanup-v3-0-32e151b0bfb0@pks.im>

The "git-new-workdir" command has been introduced to make it possible to have a separate working directory in a different place. The command thus predates git-worktree(1), which is what people use nowadays to create any such working directory. As such, the script doesn't really have much of a reason to exist nowadays anymore.

It also doesn't seem like the script is still in use: the last time it has received an update was in e32afab7b03 (git-new-workdir: don't fail if the target directory is empty, 2014-11-26), more than a decade ago. Remove it as well as the tests that depend on it.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 contrib/workdir/.gitattributes  |   1 -
 contrib/workdir/git-new-workdir | 105 ----------------------------------------
 t/meson.build                   |   1 -
 t/t1021-rerere-in-workdir.sh    |  58 ----------------------
 t/t3000-ls-files-others.sh      |  19 --------
 5 files changed, 184 deletions(-)
diff --git a/contrib/workdir/.gitattributes b/contrib/workdir/.gitattributes
deleted file mode 100644
index 1f78c5d1bd3..00000000000
--- a/contrib/workdir/.gitattributes
+++ /dev/null
@@ -1 +0,0 @@
-/git-new-workdir eol=lf
diff --git a/contrib/workdir/git-new-workdir b/contrib/workdir/git-new-workdir
deleted file mode 100755
index 989197aace0..00000000000
--- a/contrib/workdir/git-new-workdir
+++ /dev/null
@@ -1,105 +0,0 @@
-#!/bin/sh
-
-usage () {
-	echo "usage:" $@
-	exit 127
-}
-
-die () {
-	echo $@
-	exit 128
-}
-
-failed () {
-	die "unable to create new workdir '$new_workdir'!"
-}
-
-if test $# -lt 2 || test $# -gt 3
-then
-	usage "$0 <repository> <new_workdir> [<branch>]"
-fi
-
-orig_git=$1
-new_workdir=$2
-branch=$3
-
-# want to make sure that what is pointed to has a .git directory ...
-git_dir=$(cd "$orig_git" 2>/dev/null &&
-  git rev-parse --git-dir 2>/dev/null) ||
-  die "Not a git repository: \"$orig_git\""
-
-case "$git_dir" in
-.git)
-	git_dir="$orig_git/.git"
-	;;
-.)
-	git_dir=$orig_git
-	;;
-esac
-
-# don't link to a configured bare repository
-isbare=$(git --git-dir="$git_dir" config --bool --get core.bare)
-if test ztrue = "z$isbare"
-then
-	die "\"$git_dir\" has core.bare set to true," \
-		" remove from \"$git_dir/config\" to use $0"
-fi
-
-# don't link to a workdir
-if test -h "$git_dir/config"
-then
-	die "\"$orig_git\" is a working directory only, please specify" \
-		"a complete repository."
-fi
-
-# make sure the links in the workdir have full paths to the original repo
-git_dir=$(cd "$git_dir" && pwd) || exit 1
-
-# don't recreate a workdir over an existing directory, unless it's empty
-if test -d "$new_workdir"
-then
-	if test $(ls -a1 "$new_workdir/." | wc -l) -ne 2
-	then
-		die "destination directory '$new_workdir' is not empty."
-	fi
-	cleandir="$new_workdir/.git"
-else
-	cleandir="$new_workdir"
-fi
-
-mkdir -p "$new_workdir/.git" || failed
-cleandir=$(cd "$cleandir" && pwd) || failed
-
-cleanup () {
-	rm -rf "$cleandir"
-}
-siglist="0 1 2 15"
-trap cleanup $siglist
-
-# create the links to the original repo.  explicitly exclude index, HEAD and
-# logs/HEAD from the list since they are purely related to the current working
-# directory, and should not be shared.
-for x in config refs logs/refs objects info hooks packed-refs remotes rr-cache svn reftable
-do
-	# create a containing directory if needed
-	case $x in
-	*/*)
-		mkdir -p "$new_workdir/.git/${x%/*}"
-		;;
-	esac
-
-	ln -s "$git_dir/$x" "$new_workdir/.git/$x" || failed
-done
-
-# commands below this are run in the context of the new workdir
-cd "$new_workdir" || failed
-
-# copy the HEAD from the original repository as a default branch
-cp "$git_dir/HEAD" .git/HEAD || failed
-
-# the workdir is set up.  if the checkout fails, the user can fix it.
-trap - $siglist
-
-# checkout the branch (either the same as HEAD from the original repository,
-# or the one that was asked for)
-git checkout -f $branch
diff --git a/t/meson.build b/t/meson.build
index b09c0becb8d..9206090fedc 100644
--- a/t/meson.build
+++ b/t/meson.build
@@ -178,7 +178,6 @@ integration_tests = [
   't1015-read-index-unmerged.sh',
   't1016-compatObjectFormat.sh',
   't1020-subdirectory.sh',
-  't1021-rerere-in-workdir.sh',
   't1022-read-tree-partial-clone.sh',
   't1050-large.sh',
   't1051-large-conversion.sh',
diff --git a/t/t1021-rerere-in-workdir.sh b/t/t1021-rerere-in-workdir.sh
deleted file mode 100755
index 0b892894eb9..00000000000
--- a/t/t1021-rerere-in-workdir.sh
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/bin/sh
-
-test_description='rerere run in a workdir'
-GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
-export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
-
-. ./test-lib.sh
-
-test_expect_success SYMLINKS setup '
-	git config rerere.enabled true &&
-	>world &&
-	git add world &&
-	test_tick &&
-	git commit -m initial &&
-
-	echo hello >world &&
-	test_tick &&
-	git commit -a -m hello &&
-
-	git checkout -b side HEAD^ &&
-	echo goodbye >world &&
-	test_tick &&
-	git commit -a -m goodbye &&
-
-	git checkout main
-'
-
-test_expect_success SYMLINKS 'rerere in workdir' '
-	rm -rf .git/rr-cache &&
-	"$SHELL_PATH" "$TEST_DIRECTORY/../contrib/workdir/git-new-workdir" . work &&
-	(
-		cd work &&
-		test_must_fail git merge side &&
-		git rerere status >actual &&
-		echo world >expect &&
-		test_cmp expect actual
-	)
-'
-
-# This fails because we don't resolve relative symlink in mkdir_in_gitdir()
-# For the purpose of helping contrib/workdir/git-new-workdir users, we do not
-# have to support relative symlinks, but it might be nicer to make this work
-# with a relative symbolic link someday.
-test_expect_failure SYMLINKS 'rerere in workdir (relative)' '
-	rm -rf .git/rr-cache &&
-	"$SHELL_PATH" "$TEST_DIRECTORY/../contrib/workdir/git-new-workdir" . krow &&
-	(
-		cd krow &&
-		rm -f .git/rr-cache &&
-		ln -s ../.git/rr-cache .git/rr-cache &&
-		test_must_fail git merge side &&
-		git rerere status >actual &&
-		echo world >expect &&
-		test_cmp expect actual
-	)
-'
-
-test_done
diff --git a/t/t3000-ls-files-others.sh b/t/t3000-ls-files-others.sh
index 13f66fd649d..b41e7f0daa4 100755
--- a/t/t3000-ls-files-others.sh
+++ b/t/t3000-ls-files-others.sh
@@ -73,25 +73,6 @@ test_expect_success 'ls-files --others handles non-submodule .git' '
 	test_cmp expected1 output
 '
 
-test_expect_success SYMLINKS 'ls-files --others with symlinked submodule' '
-	git init super &&
-	git init sub &&
-	(
-		cd sub &&
-		>a &&
-		git add a &&
-		git commit -m sub &&
-		git pack-refs --all
-	) &&
-	(
-		cd super &&
-		"$SHELL_PATH" "$TEST_DIRECTORY/../contrib/workdir/git-new-workdir" ../sub sub &&
-		git ls-files --others --exclude-standard >../actual
-	) &&
-	echo sub/ >expect &&
-	test_cmp expect actual
-'
-
 test_expect_success 'setup nested pathspec search' '
 	test_create_repo nested &&
 	(
-- 
2.49.0.1101.gccaa498523.dirty
Previous: Patrick SteinhardtNext: Gabriel Scherer
Message 14 of 25 in “Spring cleanup of "contrib/"”
  1. 00/11 Spring cleanup of "contrib/"Patrick Steinhardt, May 12, 2025
  2. 01/11 contrib: remove "remotes2config.sh"Patrick Steinhardt, May 12, 2025
  3. 02/11 contrib: remove "examples" directoryPatrick Steinhardt, May 12, 2025
  4. 03/11 contrib: remove remote-helper stubsPatrick Steinhardt, May 12, 2025
  5. 04/11 contrib: remove "thunderbird-patch-inline"Patrick Steinhardt, May 12, 2025
  6. Junio C HamanoMay 16, 2025
  7. Toon ClaesMay 26, 2025
  8. Junio C HamanoJun 4, 2025
  9. 05/11 contrib: remove "hooks" directoryPatrick Steinhardt, May 12, 2025
  10. 07/11 contrib: remove "persistent-https" remote helperPatrick Steinhardt, May 12, 2025
  11. 06/11 contrib: remove "mw-to-git"Patrick Steinhardt, May 12, 2025
  12. 08/11 contrib: remove "git-resurrect.sh"Patrick Steinhardt, May 12, 2025
  13. 09/11 contrib: remove "emacs" directoryPatrick Steinhardt, May 12, 2025
  14. 10/11 contrib: remove "git-new-workdir"Patrick Steinhardt, May 12, 2025
  15. Gabriel SchererSep 8, 2025
  16. Kristoffer HaugsbakkSep 8, 2025
  17. Gabriel SchererSep 8, 2025
  18. D. Ben KnobleSep 12, 2025
  19. Gabriel SchererSep 12, 2025
  20. Junio C HamanoSep 12, 2025
  21. Phillip WoodSep 12, 2025
  22. Junio C HamanoSep 12, 2025
  23. Junio C HamanoSep 8, 2025
  24. 11/11 contrib: remove some scripts in "stats" directoryPatrick Steinhardt, May 12, 2025
  25. Elijah NewrenMay 13, 2025

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.