Julian Phillips [off-list ref] writes:
quoted hunk
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.
+
+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?
+
+# 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.
Dq all pathname values you get from the user, like "$orig_git".
They may have SP in them.
Do you need all those braces around shell variable names?
+# vim: tabstop=8
+# vim: noexpandtab
Lose these two lines, please.
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 <redacted>
---
On Mon, 26 Mar 2007, Junio C Hamano wrote:
Julian Phillips [off-list ref] writes:
quoted
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 ...
quoted
+
+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".
quoted
+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.
quoted
+
+# 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!";
quoted
+
+# don't link to a workdir, link to the original repo the workdir is
linked to
quoted
+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.
quoted
+# 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