* [PATCH] contrib/workdir: add a simple script to create a working directory
@ 2007-03-26 23:15 Julian Phillips
2007-03-26 23:42 ` Junio C Hamano
0 siblings, 1 reply; 9+ messages in thread
From: Julian Phillips @ 2007-03-26 23:15 UTC (permalink / raw)
To: git
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. A poor-man's .gitlink if you will.
Signed-off-by: Julian Phillips <julian@quantumfyre.co.uk>
---
I wrote this for my own use based on a post from Junio earlier this month
(http://article.gmane.org/gmane.comp.version-control.git/41513/).
Sent just in case it might be useful?
contrib/workdir/git-new-workdir | 53 +++++++++++++++++++++++++++++++++++++++
1 files changed, 53 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..4f4f926
--- /dev/null
+++ b/contrib/workdir/git-new-workdir
@@ -0,0 +1,53 @@
+#!/bin/bash
+
+function usage () {
+ echo "usage:" $1;
+ exit 127;
+}
+
+function die () {
+ echo $1;
+ exit 128;
+}
+
+test $# -eq 3 || usage "$0 <original> <new_workdir> <branch>";
+
+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 "${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
+
+# 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 dir ${new_workdir}!";
+
+# create the links to the original repo
+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};
+# create a fake HEAD, to stop checkout complaining
+echo "ref: refs/heads/master" > .git/HEAD;
+# now checkout the branch that was asked for
+git checkout ${branch};
+
+# vim: tabstop=8
+# vim: noexpandtab
--
1.5.0.5
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH] contrib/workdir: add a simple script to create a working directory
2007-03-26 23:42 ` Junio C Hamano
@ 2007-03-26 23:15 ` Julian Phillips
2007-03-27 2:42 ` Eric Lesh
2007-03-27 5:59 ` Junio C Hamano
0 siblings, 2 replies; 9+ messages in thread
From: Julian Phillips @ 2007-03-26 23:15 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
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@quantumfyre.co.uk>
---
On Mon, 26 Mar 2007, Junio C Hamano wrote:
> Julian Phillips <julian@quantumfyre.co.uk> writes:
>
>> 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. A poor-man's .gitlink if you will.
>
> I would not call it poor-man's. It is 'without complexity' and
> that is a good thing, especially when you are not doing any
> submodule stuff.
True, it may not be as wizzy as .gitlink no doubt will be, but I
think it will suit me nicely.
I also thought it was worth a reference to your caveat, but perhaps
that would be better as a comment in the code?
>
>> +# create the links to the original repo
>> +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
>
> I think the above list "for x" is correct, but probably the code
> wants to comment on why it specifically excludes logs/HEAD from
> the symlinked set ;-).
Good point.
>
>> +# now setup the workdir
>> +cd ${new_workdir};
>> +# create a fake HEAD, to stop checkout complaining
>> +echo "ref: refs/heads/master" > .git/HEAD;
>> +# now checkout the branch that was asked for
>> +git checkout ${branch};
>
> If ${branch} was 'master', does this do a checkout? I think -f
> might be needed.
>
It worked when I tried it ... but -f might be worth it anyway.
contrib/workdir/git-new-workdir | 55 +++++++++++++++++++++++++++++++++++++++
1 files changed, 55 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..5bfd87e
--- /dev/null
+++ b/contrib/workdir/git-new-workdir
@@ -0,0 +1,55 @@
+#!/bin/bash
+
+function usage () {
+ echo "usage:" $1;
+ exit 127;
+}
+
+function die () {
+ echo $1;
+ exit 128;
+}
+
+test $# -eq 3 || usage "$0 <original> <new_workdir> <branch>";
+
+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 "${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
+
+# 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 dir ${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};
+# create a fake HEAD, to stop checkout complaining
+echo "ref: refs/heads/master" > .git/HEAD;
+# now checkout the branch that was asked for
+git checkout -f ${branch};
+
+# vim: tabstop=8
+# vim: noexpandtab
--
1.5.0.5
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v3] contrib/workdir: add a simple script to create a working directory
2007-03-27 5:59 ` Junio C Hamano
@ 2007-03-26 23:15 ` Julian Phillips
0 siblings, 0 replies; 9+ messages in thread
From: Julian Phillips @ 2007-03-26 23:15 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
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@quantumfyre.co.uk>
---
On Mon, 26 Mar 2007, Junio C Hamano wrote:
> Julian Phillips <julian@quantumfyre.co.uk> 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
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH] contrib/workdir: add a simple script to create a working directory
2007-03-26 23:15 [PATCH] contrib/workdir: add a simple script to create a working directory Julian Phillips
@ 2007-03-26 23:42 ` Junio C Hamano
2007-03-26 23:15 ` Julian Phillips
0 siblings, 1 reply; 9+ messages in thread
From: Junio C Hamano @ 2007-03-26 23:42 UTC (permalink / raw)
To: Julian Phillips; +Cc: git
Julian Phillips <julian@quantumfyre.co.uk> writes:
> 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. A poor-man's .gitlink if you will.
I would not call it poor-man's. It is 'without complexity' and
that is a good thing, especially when you are not doing any
submodule stuff.
> +# create the links to the original repo
> +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
I think the above list "for x" is correct, but probably the code
wants to comment on why it specifically excludes logs/HEAD from
the symlinked set ;-).
> +# now setup the workdir
> +cd ${new_workdir};
> +# create a fake HEAD, to stop checkout complaining
> +echo "ref: refs/heads/master" > .git/HEAD;
> +# now checkout the branch that was asked for
> +git checkout ${branch};
If ${branch} was 'master', does this do a checkout? I think -f
might be needed.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] contrib/workdir: add a simple script to create a working directory
2007-03-26 23:15 ` Julian Phillips
@ 2007-03-27 2:42 ` Eric Lesh
2007-03-27 4:13 ` Junio C Hamano
2007-03-27 12:59 ` Julian Phillips
2007-03-27 5:59 ` Junio C Hamano
1 sibling, 2 replies; 9+ messages in thread
From: Eric Lesh @ 2007-03-27 2:42 UTC (permalink / raw)
To: Julian Phillips; +Cc: Junio C Hamano, git
On Tue, 2007-03-27 at 00:15 +0100, Julian Phillips wrote:
> +# 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!";
> +
Shouldn't this be made to work with bare repositories as well?
-Eric
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] contrib/workdir: add a simple script to create a working directory
2007-03-27 2:42 ` Eric Lesh
@ 2007-03-27 4:13 ` Junio C Hamano
2007-03-27 12:59 ` Julian Phillips
1 sibling, 0 replies; 9+ messages in thread
From: Junio C Hamano @ 2007-03-27 4:13 UTC (permalink / raw)
To: Eric Lesh; +Cc: Julian Phillips, git
Eric Lesh <eclesh@ucla.edu> writes:
> On Tue, 2007-03-27 at 00:15 +0100, Julian Phillips wrote:
>> +# 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!";
>> +
>
> Shouldn't this be made to work with bare repositories as well?
I think you could enhance Julian's script for that.
But you need to be careful that bare and non-bare repositories
are often of quite different nature. The script might need to
decide which parts to borrow from the original and which parts
to have in the borrowing repository depending on that.
For example, a bare repository by default does not have reflog,
but a working tree that borrows from the bare repository might
want to enable reflog. In such a case, creating a symlink to
orig.git/logs/refs would not be sufficient, and you would either
want to enable reflog for the original bare repository and/or
have .git/logs/refs hierarchy as a non-symlinked, real directory
of your own.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] contrib/workdir: add a simple script to create a working directory
2007-03-26 23:15 ` Julian Phillips
2007-03-27 2:42 ` Eric Lesh
@ 2007-03-27 5:59 ` Junio C Hamano
2007-03-26 23:15 ` [PATCH v3] " Julian Phillips
1 sibling, 1 reply; 9+ messages in thread
From: Junio C Hamano @ 2007-03-27 5:59 UTC (permalink / raw)
To: Julian Phillips; +Cc: git
Julian Phillips <julian@quantumfyre.co.uk> 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.
> +
> +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.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] contrib/workdir: add a simple script to create a working directory
2007-03-27 2:42 ` Eric Lesh
2007-03-27 4:13 ` Junio C Hamano
@ 2007-03-27 12:59 ` Julian Phillips
2007-03-27 13:50 ` Eric Lesh
1 sibling, 1 reply; 9+ messages in thread
From: Julian Phillips @ 2007-03-27 12:59 UTC (permalink / raw)
To: Eric Lesh; +Cc: Junio C Hamano, git
On Mon, 26 Mar 2007, Eric Lesh wrote:
> On Tue, 2007-03-27 at 00:15 +0100, Julian Phillips wrote:
>> +# 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!";
>> +
>
> Shouldn't this be made to work with bare repositories as well?
I guess that depends ...
There's probably no reason that it couldn't, but it wasn't something that
I was interested in seeing it do. I don't have any bare repositories on
my development machine, and don't anticipate having any in the future.
--
Julian
---
"Contrary to popular belief, penguins are not the salvation of modern
technology. Neither do they throw parties for the urban proletariat."
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] contrib/workdir: add a simple script to create a working directory
2007-03-27 12:59 ` Julian Phillips
@ 2007-03-27 13:50 ` Eric Lesh
0 siblings, 0 replies; 9+ messages in thread
From: Eric Lesh @ 2007-03-27 13:50 UTC (permalink / raw)
To: Julian Phillips; +Cc: Junio C Hamano, git
On Tue, 2007-03-27 at 13:59 +0100, Julian Phillips wrote:
> > Shouldn't this be made to work with bare repositories as well?
>
> I guess that depends ...
>
> There's probably no reason that it couldn't, but it wasn't something that
> I was interested in seeing it do. I don't have any bare repositories on
> my development machine, and don't anticipate having any in the future.
>
Also, the symlinked config file will have core.bare = true, which will
make anything with require_work_tree refuse to run. (Unless
git-sh-setup's is_bare_repository was made to look for .git first, then
check for core.bare. But that is probably useless.)
You're right in that there may not be many use cases for this. Sorry
for the noise.
-Eric
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2007-03-27 13:50 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-03-26 23:15 [PATCH] contrib/workdir: add a simple script to create a working directory Julian Phillips
2007-03-26 23:42 ` Junio C Hamano
2007-03-26 23:15 ` Julian Phillips
2007-03-27 2:42 ` Eric Lesh
2007-03-27 4:13 ` Junio C Hamano
2007-03-27 12:59 ` Julian Phillips
2007-03-27 13:50 ` Eric Lesh
2007-03-27 5:59 ` Junio C Hamano
2007-03-26 23:15 ` [PATCH v3] " Julian Phillips
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).