Add a simple script to create a working directory that uses symlinks to point at an exisiting repository. This allows having different branches in different working directories but all from the same repository. Based on a description from Junio of how he creates multiple working directories[1]. With the following caveat: "This risks confusion for an uninitiated if you update a ref that is checked out in another working tree, but modulo that caveat it works reasonably well." [1] http://article.gmane.org/gmane.comp.version-control.git/41513/ Signed-off-by: Julian Phillips <julian@xxxxxxxxxxxxxxxxx> --- On Mon, 26 Mar 2007, Junio C Hamano wrote: > Julian Phillips <julian@xxxxxxxxxxxxxxxxx> writes: > >> diff --git a/contrib/workdir/git-new-workdir b/contrib/workdir/git-new-workdir >> new file mode 100755 >> index 0000000..5bfd87e >> --- /dev/null >> +++ b/contrib/workdir/git-new-workdir >> @@ -0,0 +1,55 @@ >> +#!/bin/bash > > I do not see anything bash specific you need to do in your > script. No. Sorry, old habits die hard ... > >> + >> +function usage () { >> + echo "usage:" $1; >> + exit 127; >> +} >> + >> +function die () { >> + echo $1; >> + exit 128; >> +} > > Do not add noiseword "function" in our shell scripts, please. > This is the only thing POSIX says "produces unspecified results" > I found in your script, so if you lose them you shouldn't have > to say "#!/bin/bash". > >> +test $# -eq 3 || usage "$0 <original> <new_workdir> <branch>"; >> + >> +orig_git=$1; >> +new_workdir=$2; >> +branch=$3; > > Perhaps default branch to whatever original's HEAD points at? Yes, sounds good. > >> + >> +# want to make sure that what is pointed to has a .git directory ... >> +test -d ${orig_git}/.git || die "${original_git} is not a git repository!"; >> + >> +# don't link to a workdir, link to the original repo the workdir is linked to >> +if test -L ${orig_git}/.git/config >> +then >> + orig_git=$(dirname $(dirname $(readlink -f gm/.git/config))); >> +fi > > "gm"? I think it is not worth doing this, as readlink is not > all that portable. Just see if it is a symlink and error out. Er, quite. Shouldn't write scripts at 02:00 ... Didn't know readlink wasn't portable - so now I've learnt my one thing for today ... ;) > > Dq all pathname values you get from the user, like "$orig_git". > They may have SP in them. Oops. > > Do you need all those braces around shell variable names? No, old habits again I'm afraid. > >> +# vim: tabstop=8 >> +# vim: noexpandtab > > Lose these two lines, please. > Gone. contrib/workdir/git-new-workdir | 57 +++++++++++++++++++++++++++++++++++++++ 1 files changed, 57 insertions(+), 0 deletions(-) create mode 100755 contrib/workdir/git-new-workdir diff --git a/contrib/workdir/git-new-workdir b/contrib/workdir/git-new-workdir new file mode 100755 index 0000000..9e70a59 --- /dev/null +++ b/contrib/workdir/git-new-workdir @@ -0,0 +1,57 @@ +#!/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 ... +test -d "$orig_git/.git" || die "\"$orig_git\" is not a git repository!"; + +# don't link to a workdir +if test -L "$orig_git/.git/config" +then + die "\"$orig_git\" is a working directory only, please specify" \ + "a complete repository."; +fi + +# make sure the the links use full paths +orig_git=$(cd "$orig_git"; 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 "$orig_git/.git/$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 "$orig_git/.git/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; -- 1.5.0.5 - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html