1#!/bin/sh 2 3usage () { 4echo"usage:" $@ 5exit127 6} 7 8die () { 9echo $@ 10exit128 11} 12 13iftest$#-lt2||test$#-gt3 14then 15 usage "$0<repository> <new_workdir> [<branch>]" 16fi 17 18orig_git=$1 19new_workdir=$2 20branch=$3 21 22# want to make sure that what is pointed to has a .git directory ... 23git_dir=$(cd"$orig_git"2>/dev/null && 24 git rev-parse --git-dir2>/dev/null) || 25 die "Not a git repository:\"$orig_git\"" 26 27case"$git_dir"in 28.git) 29 git_dir="$orig_git/.git" 30;; 31.) 32 git_dir=$orig_git 33;; 34esac 35 36# don't link to a configured bare repository 37isbare=$(git --git-dir="$git_dir" config --bool --get core.bare) 38iftest ztrue = z$isbare 39then 40 die "\"$git_dir\"has core.bare set to true," \ 41" remove from\"$git_dir/config\"to use$0" 42fi 43 44# don't link to a workdir 45iftest -L"$git_dir/config" 46then 47 die "\"$orig_git\"is a working directory only, please specify" \ 48"a complete repository." 49fi 50 51# don't recreate a workdir over an existing repository 52iftest -e"$new_workdir" 53then 54 die "destination directory '$new_workdir' already exists." 55fi 56 57# make sure the the links use full paths 58git_dir=$(cd "$git_dir"; pwd) 59 60# create the workdir 61mkdir-p"$new_workdir/.git"|| die "unable to create\"$new_workdir\"!" 62 63# create the links to the original repo. explictly exclude index, HEAD and 64# logs/HEAD from the list since they are purely related to the current working 65# directory, and should not be shared. 66for x in config refs logs/refs objects info hooks packed-refs remotes rr-cache svn 67do 68case$xin 69*/*) 70mkdir-p"$(dirname "$new_workdir/.git/$x")" 71;; 72esac 73ln-s"$git_dir/$x""$new_workdir/.git/$x" 74done 75 76# now setup the workdir 77cd"$new_workdir" 78# copy the HEAD from the original repository as a default branch 79cp"$git_dir/HEAD" .git/HEAD 80# checkout the branch (either the same as HEAD from the original repository, or 81# the one that was asked for) 82git checkout -f$branch