8fa0ee3b50
If core.bare is set to true in the config file of a repository that the user is trying to create a working directory from we should abort and suggest to the user that they remove the option first. If we leave the core.bare=true setting in the config file then working tree operations will get confused when they attempt to execute in the new workdir, as it shares its config file with the bare repository. The working tree operations will assume that the workdir is bare and abort, which is not what the user wants. If we changed core.bare to be false then working tree operations will function in the workdir but other operations may fail in the bare repository, as it claims to not be bare. If we remove core.bare from the config then Git can fallback on the legacy guessing behavior. This allows operations in the bare repository to work as though it were bare, while operations in the workdirs to act as though they are not bare. Signed-off-by: Shawn O. Pearce <spearce@spearce.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
77 lines
1.7 KiB
Bash
Executable File
77 lines
1.7 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
usage () {
|
|
echo "usage:" $@
|
|
exit 127
|
|
}
|
|
|
|
die () {
|
|
echo $@
|
|
exit 128
|
|
}
|
|
|
|
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 "\"$orig_git\" is not a git repository!"
|
|
|
|
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 -L "$git_dir/config"
|
|
then
|
|
die "\"$orig_git\" is a working directory only, please specify" \
|
|
"a complete repository."
|
|
fi
|
|
|
|
# make sure the the links use full paths
|
|
git_dir=$(cd "$git_dir"; pwd)
|
|
|
|
# create the workdir
|
|
mkdir -p "$new_workdir/.git" || die "unable to create \"$new_workdir\"!"
|
|
|
|
# create the links to the original repo. explictly 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
|
|
do
|
|
case $x in
|
|
*/*)
|
|
mkdir -p "$(dirname "$new_workdir/.git/$x")"
|
|
;;
|
|
esac
|
|
ln -s "$git_dir/$x" "$new_workdir/.git/$x"
|
|
done
|
|
|
|
# now setup the workdir
|
|
cd "$new_workdir"
|
|
# copy the HEAD from the original repository as a default branch
|
|
cp "$git_dir/HEAD" .git/HEAD
|
|
# checkout the branch (either the same as HEAD from the original repository, or
|
|
# the one that was asked for)
|
|
git checkout -f $branch
|