Re: [PATCH] contrib/workdir: add a simple script to create a working directory

6 messages, 3 authors, 2016-06-15 · open the first message on its own page

Re: [PATCH] contrib/workdir: add a simple script to create a working directory

From: Junio C Hamano <hidden>
Date: 2016-06-15 22:43:01

Julian Phillips [off-list ref] 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.

[PATCH] contrib/workdir: add a simple script to create a working directory

From: Julian Phillips <hidden>
Date: 2016-06-15 22:43:01

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
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?
quoted
+# create the links to the original repo
+for x in config refs logs/refs objects info hooks packed-refs remotes
rr-cache
quoted
+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.
quoted
+# 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

Re: [PATCH] contrib/workdir: add a simple script to create a working directory

From: Eric Lesh <hidden>
Date: 2016-06-15 22:43:01

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

Re: [PATCH] contrib/workdir: add a simple script to create a working directory

From: Junio C Hamano <hidden>
Date: 2016-06-15 22:43:01

Eric Lesh [off-list ref] writes:
On Tue, 2007-03-27 at 00:15 +0100, Julian Phillips wrote:
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!";
+
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.

Re: [PATCH] contrib/workdir: add a simple script to create a working directory

From: Julian Phillips <hidden>
Date: 2016-06-15 22:43:01

On Mon, 26 Mar 2007, Eric Lesh wrote:
On Tue, 2007-03-27 at 00:15 +0100, Julian Phillips wrote:
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!";
+
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."

Re: [PATCH] contrib/workdir: add a simple script to create a working directory

From: Eric Lesh <hidden>
Date: 2016-06-15 22:43:01

On Tue, 2007-03-27 at 13:59 +0100, Julian Phillips wrote:
quoted
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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help