* GIT_DIR not auto ignored
@ 2013-12-01 7:06 Ingy dot Net
2013-12-01 18:08 ` Dennis Kaarsemaker
0 siblings, 1 reply; 17+ messages in thread
From: Ingy dot Net @ 2013-12-01 7:06 UTC (permalink / raw)
To: git
Greetings,
I found this probable bug:
https://gist.github.com/anonymous/01979fd9e6e285df41a2
Cheers, Ingy döt Net
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: GIT_DIR not auto ignored
2013-12-01 7:06 GIT_DIR not auto ignored Ingy dot Net
@ 2013-12-01 18:08 ` Dennis Kaarsemaker
2013-12-01 18:30 ` Dennis Kaarsemaker
0 siblings, 1 reply; 17+ messages in thread
From: Dennis Kaarsemaker @ 2013-12-01 18:08 UTC (permalink / raw)
To: Ingy dot Net; +Cc: git
On za, 2013-11-30 at 23:06 -0800, Ingy dot Net wrote:
> Greetings,
>
> I found this probable bug:
> https://gist.github.com/anonymous/01979fd9e6e285df41a2
Summary:
$ mv .git .foo
$ export GIT_DIR=$PWD/.foo
$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
# .foo/
nothing added to commit but untracked files present
I checked with 1.8.5 and this still happens. And this also happens:
$ mv .git .foo
$ export GIT_DIR=.foo
dennis@lightning:~/code/git$ touch .git
dennis@lightning:~/code/git$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
.foo/
nothing added to commit but untracked files present (use "git add" to
track)
(Note the absence of .git there)
--
Dennis Kaarsemaker
www.kaarsemaker.net
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: GIT_DIR not auto ignored
2013-12-01 18:08 ` Dennis Kaarsemaker
@ 2013-12-01 18:30 ` Dennis Kaarsemaker
2013-12-01 19:04 ` [PATCH] path_treatment: also ignore $GIT_DIR if it's not .git Dennis Kaarsemaker
0 siblings, 1 reply; 17+ messages in thread
From: Dennis Kaarsemaker @ 2013-12-01 18:30 UTC (permalink / raw)
To: Ingy dot Net; +Cc: git
On zo, 2013-12-01 at 19:08 +0100, Dennis Kaarsemaker wrote:
> On za, 2013-11-30 at 23:06 -0800, Ingy dot Net wrote:
> > Greetings,
> >
> > I found this probable bug:
> > https://gist.github.com/anonymous/01979fd9e6e285df41a2
>
> Summary:
>
> $ mv .git .foo
> $ export GIT_DIR=$PWD/.foo
> $ git status
> # On branch master
> #
> # Initial commit
> #
> # Untracked files:
> # .foo/
> nothing added to commit but untracked files present
>
>
> I checked with 1.8.5 and this still happens.
This makes it go away:
diff --git a/dir.c b/dir.c
index 23b6de4..884b37d 100644
--- a/dir.c
+++ b/dir.c
@@ -1198,7 +1198,7 @@ static enum path_treatment treat_path(struct dir_struct *dir,
return path_none;
strbuf_setlen(path, baselen);
strbuf_addstr(path, de->d_name);
- if (simplify_away(path->buf, path->len, simplify))
+ if (simplify_away(path->buf, path->len, simplify) || is_git_directory(path->buf))
return path_none;
dtype = DTYPE(de);
I'll add a test and submit a proper patch.
> And this also happens:
>
> $ mv .git .foo
> $ export GIT_DIR=.foo
> dennis@lightning:~/code/git$ touch .git
> dennis@lightning:~/code/git$ git status
> On branch master
> Untracked files:
> (use "git add <file>..." to include in what will be committed)
>
> .foo/
>
> nothing added to commit but untracked files present (use "git add" to
> track)
>
> (Note the absence of .git there)
Comments in dir.c indicate that this is expected, so I didn't try to
"fix" that.
--
Dennis Kaarsemaker
www.kaarsemaker.net
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH] path_treatment: also ignore $GIT_DIR if it's not .git
2013-12-01 18:30 ` Dennis Kaarsemaker
@ 2013-12-01 19:04 ` Dennis Kaarsemaker
2013-12-01 23:02 ` Duy Nguyen
` (2 more replies)
0 siblings, 3 replies; 17+ messages in thread
From: Dennis Kaarsemaker @ 2013-12-01 19:04 UTC (permalink / raw)
To: git; +Cc: ingy
We always ignore anything named .git, but we should also ignore the git
directory if the user overrides it by setting $GIT_DIR
Reported-By: Ingy döt Net <ingy@ingy.net>
Signed-off-by: Dennis Kaarsemaker <dennis@kaarsemaker.net>
---
dir.c | 2 +-
t/t7508-status.sh | 7 +++++++
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/dir.c b/dir.c
index 23b6de4..884b37d 100644
--- a/dir.c
+++ b/dir.c
@@ -1198,7 +1198,7 @@ static enum path_treatment treat_path(struct dir_struct *dir,
return path_none;
strbuf_setlen(path, baselen);
strbuf_addstr(path, de->d_name);
- if (simplify_away(path->buf, path->len, simplify))
+ if (simplify_away(path->buf, path->len, simplify) || is_git_directory(path->buf))
return path_none;
dtype = DTYPE(de);
diff --git a/t/t7508-status.sh b/t/t7508-status.sh
index c987b5e..2bd7ef1 100755
--- a/t/t7508-status.sh
+++ b/t/t7508-status.sh
@@ -198,6 +198,13 @@ test_expect_success 'status -s' '
'
+test_expect_success 'status -s with non-standard $GIT_DIR' '
+ mv .git .foo &&
+ GIT_DIR=.foo git status -s >output &&
+ test_cmp expect output &&
+ mv .foo .git
+'
+
test_expect_success 'status with gitignore' '
{
echo ".gitignore" &&
--
1.8.5-386-gb78cb96
--
Dennis Kaarsemaker <dennis@kaarsemaker.net>
http://twitter.com/seveas
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH] path_treatment: also ignore $GIT_DIR if it's not .git
2013-12-01 19:04 ` [PATCH] path_treatment: also ignore $GIT_DIR if it's not .git Dennis Kaarsemaker
@ 2013-12-01 23:02 ` Duy Nguyen
2013-12-01 23:08 ` Thomas Rast
2013-12-02 1:21 ` Eric Sunshine
2013-12-03 15:18 ` Karsten Blees
2 siblings, 1 reply; 17+ messages in thread
From: Duy Nguyen @ 2013-12-01 23:02 UTC (permalink / raw)
To: Dennis Kaarsemaker; +Cc: Git Mailing List, ingy
On Mon, Dec 2, 2013 at 2:04 AM, Dennis Kaarsemaker
<dennis@kaarsemaker.net> wrote:
> We always ignore anything named .git, but we should also ignore the git
> directory if the user overrides it by setting $GIT_DIR
>
> Reported-By: Ingy döt Net <ingy@ingy.net>
> Signed-off-by: Dennis Kaarsemaker <dennis@kaarsemaker.net>
> ---
> dir.c | 2 +-
> t/t7508-status.sh | 7 +++++++
> 2 files changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/dir.c b/dir.c
> index 23b6de4..884b37d 100644
> --- a/dir.c
> +++ b/dir.c
> @@ -1198,7 +1198,7 @@ static enum path_treatment treat_path(struct dir_struct *dir,
> return path_none;
> strbuf_setlen(path, baselen);
> strbuf_addstr(path, de->d_name);
> - if (simplify_away(path->buf, path->len, simplify))
> + if (simplify_away(path->buf, path->len, simplify) || is_git_directory(path->buf))
> return path_none;
this adds 2 access, 1 lstat, 1 open, 1 read, 1 close to _every_ path
we check. Is it worth the cost?
>
> dtype = DTYPE(de);
> diff --git a/t/t7508-status.sh b/t/t7508-status.sh
> index c987b5e..2bd7ef1 100755
> --- a/t/t7508-status.sh
> +++ b/t/t7508-status.sh
> @@ -198,6 +198,13 @@ test_expect_success 'status -s' '
>
> '
>
> +test_expect_success 'status -s with non-standard $GIT_DIR' '
> + mv .git .foo &&
> + GIT_DIR=.foo git status -s >output &&
> + test_cmp expect output &&
> + mv .foo .git
> +'
> +
> test_expect_success 'status with gitignore' '
> {
> echo ".gitignore" &&
> --
> 1.8.5-386-gb78cb96
>
>
> --
> Dennis Kaarsemaker <dennis@kaarsemaker.net>
> http://twitter.com/seveas
> --
> To unsubscribe from this list: send the line "unsubscribe git" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
Duy
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] path_treatment: also ignore $GIT_DIR if it's not .git
2013-12-01 23:02 ` Duy Nguyen
@ 2013-12-01 23:08 ` Thomas Rast
2013-12-01 23:38 ` Dennis Kaarsemaker
0 siblings, 1 reply; 17+ messages in thread
From: Thomas Rast @ 2013-12-01 23:08 UTC (permalink / raw)
To: Duy Nguyen; +Cc: Dennis Kaarsemaker, Git Mailing List, ingy
Duy Nguyen <pclouds@gmail.com> writes:
> On Mon, Dec 2, 2013 at 2:04 AM, Dennis Kaarsemaker
> <dennis@kaarsemaker.net> wrote:
>> We always ignore anything named .git, but we should also ignore the git
>> directory if the user overrides it by setting $GIT_DIR
[...]
>> + if (simplify_away(path->buf, path->len, simplify) || is_git_directory(path->buf))
>> return path_none;
>
> this adds 2 access, 1 lstat, 1 open, 1 read, 1 close to _every_ path
> we check. Is it worth the cost?
Moreover it is a much more inclusive check than what the commit message
claims: it will ignore anything that looks like a .git directory,
regardless of the name. In particular GIT_DIR doesn't have anything to
do with it.
--
Thomas Rast
tr@thomasrast.ch
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] path_treatment: also ignore $GIT_DIR if it's not .git
2013-12-01 23:08 ` Thomas Rast
@ 2013-12-01 23:38 ` Dennis Kaarsemaker
2013-12-02 0:38 ` Duy Nguyen
0 siblings, 1 reply; 17+ messages in thread
From: Dennis Kaarsemaker @ 2013-12-01 23:38 UTC (permalink / raw)
To: Thomas Rast; +Cc: Duy Nguyen, Git Mailing List, ingy
On ma, 2013-12-02 at 00:08 +0100, Thomas Rast wrote:
> Duy Nguyen <pclouds@gmail.com> writes:
>
> > On Mon, Dec 2, 2013 at 2:04 AM, Dennis Kaarsemaker
> > <dennis@kaarsemaker.net> wrote:
> >> We always ignore anything named .git, but we should also ignore the git
> >> directory if the user overrides it by setting $GIT_DIR
> [...]
> >> + if (simplify_away(path->buf, path->len, simplify) || is_git_directory(path->buf))
> >> return path_none;
> >
> > this adds 2 access, 1 lstat, 1 open, 1 read, 1 close to _every_ path
> > we check. Is it worth the cost?
>
> Moreover it is a much more inclusive check than what the commit message
> claims: it will ignore anything that looks like a .git directory,
> regardless of the name. In particular GIT_DIR doesn't have anything to
> do with it.
Ah, yes thanks, that's rather incorrect indeed. How about the following
instead? Passes all tests, including the new one.
--- a/dir.c
+++ b/dir.c
@@ -1198,7 +1198,7 @@ static enum path_treatment treat_path(struct dir_struct *dir,
return path_none;
strbuf_setlen(path, baselen);
strbuf_addstr(path, de->d_name);
- if (simplify_away(path->buf, path->len, simplify))
+ if (simplify_away(path->buf, path->len, simplify) || !strncmp(get_git_dir(), path->buf, path->len))
return path_none;
--
Dennis Kaarsemaker
www.kaarsemaker.net
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] path_treatment: also ignore $GIT_DIR if it's not .git
2013-12-01 23:38 ` Dennis Kaarsemaker
@ 2013-12-02 0:38 ` Duy Nguyen
2013-12-02 8:01 ` Dennis Kaarsemaker
0 siblings, 1 reply; 17+ messages in thread
From: Duy Nguyen @ 2013-12-02 0:38 UTC (permalink / raw)
To: Dennis Kaarsemaker; +Cc: Thomas Rast, Git Mailing List, ingy
On Mon, Dec 2, 2013 at 6:38 AM, Dennis Kaarsemaker
<dennis@kaarsemaker.net> wrote:
> On ma, 2013-12-02 at 00:08 +0100, Thomas Rast wrote:
>> Duy Nguyen <pclouds@gmail.com> writes:
>>
>> > On Mon, Dec 2, 2013 at 2:04 AM, Dennis Kaarsemaker
>> > <dennis@kaarsemaker.net> wrote:
>> >> We always ignore anything named .git, but we should also ignore the git
>> >> directory if the user overrides it by setting $GIT_DIR
>> [...]
>> >> + if (simplify_away(path->buf, path->len, simplify) || is_git_directory(path->buf))
>> >> return path_none;
>> >
>> > this adds 2 access, 1 lstat, 1 open, 1 read, 1 close to _every_ path
>> > we check. Is it worth the cost?
>>
>> Moreover it is a much more inclusive check than what the commit message
>> claims: it will ignore anything that looks like a .git directory,
>> regardless of the name. In particular GIT_DIR doesn't have anything to
>> do with it.
>
> Ah, yes thanks, that's rather incorrect indeed. How about the following
> instead? Passes all tests, including the new one.
>
> --- a/dir.c
> +++ b/dir.c
> @@ -1198,7 +1198,7 @@ static enum path_treatment treat_path(struct dir_struct *dir,
> return path_none;
> strbuf_setlen(path, baselen);
> strbuf_addstr(path, de->d_name);
> - if (simplify_away(path->buf, path->len, simplify))
> + if (simplify_away(path->buf, path->len, simplify) || !strncmp(get_git_dir(), path->buf, path->len))
> return path_none;
get_git_dir() may return a relative or absolute path, depending on
GIT_DIR/GIT_WORK_TREE. path->buf is always relative. You'll pass one
case with this (relative vs relative) and fail another. It might be
simpler to just add get_git_dir(), after converting to relative path
and check if it's in worktree, to the exclude list and let the current
exclude mechanism handle it.
--
Duy
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] path_treatment: also ignore $GIT_DIR if it's not .git
2013-12-01 19:04 ` [PATCH] path_treatment: also ignore $GIT_DIR if it's not .git Dennis Kaarsemaker
2013-12-01 23:02 ` Duy Nguyen
@ 2013-12-02 1:21 ` Eric Sunshine
2013-12-03 15:18 ` Karsten Blees
2 siblings, 0 replies; 17+ messages in thread
From: Eric Sunshine @ 2013-12-02 1:21 UTC (permalink / raw)
To: Dennis Kaarsemaker; +Cc: Git List, ingy
On Sun, Dec 1, 2013 at 2:04 PM, Dennis Kaarsemaker
<dennis@kaarsemaker.net> wrote:
> diff --git a/t/t7508-status.sh b/t/t7508-status.sh
> index c987b5e..2bd7ef1 100755
> --- a/t/t7508-status.sh
> +++ b/t/t7508-status.sh
> @@ -198,6 +198,13 @@ test_expect_success 'status -s' '
>
> '
>
> +test_expect_success 'status -s with non-standard $GIT_DIR' '
> + mv .git .foo &&
> + GIT_DIR=.foo git status -s >output &&
> + test_cmp expect output &&
> + mv .foo .git
If test_cmp returns a failure status, the following 'mv' command will
never be invoked, thus all subsequent tests in the script will fail
since the .git directory will be missing. Instead, use
test_when_finished to restore .git from .foo.
> +'
> +
> test_expect_success 'status with gitignore' '
> {
> echo ".gitignore" &&
> --
> 1.8.5-386-gb78cb96
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] path_treatment: also ignore $GIT_DIR if it's not .git
2013-12-02 0:38 ` Duy Nguyen
@ 2013-12-02 8:01 ` Dennis Kaarsemaker
2013-12-02 9:35 ` Duy Nguyen
0 siblings, 1 reply; 17+ messages in thread
From: Dennis Kaarsemaker @ 2013-12-02 8:01 UTC (permalink / raw)
To: Duy Nguyen; +Cc: Thomas Rast, Git Mailing List, ingy
On ma, 2013-12-02 at 07:38 +0700, Duy Nguyen wrote:
> On Mon, Dec 2, 2013 at 6:38 AM, Dennis Kaarsemaker
> <dennis@kaarsemaker.net> wrote:
> > On ma, 2013-12-02 at 00:08 +0100, Thomas Rast wrote:
> >> Duy Nguyen <pclouds@gmail.com> writes:
> >>
> >> > On Mon, Dec 2, 2013 at 2:04 AM, Dennis Kaarsemaker
> >> > <dennis@kaarsemaker.net> wrote:
> >> >> We always ignore anything named .git, but we should also ignore the git
> >> >> directory if the user overrides it by setting $GIT_DIR
> >> [...]
> >> >> + if (simplify_away(path->buf, path->len, simplify) || is_git_directory(path->buf))
> >> >> return path_none;
> >> >
> >> > this adds 2 access, 1 lstat, 1 open, 1 read, 1 close to _every_ path
> >> > we check. Is it worth the cost?
> >>
> >> Moreover it is a much more inclusive check than what the commit message
> >> claims: it will ignore anything that looks like a .git directory,
> >> regardless of the name. In particular GIT_DIR doesn't have anything to
> >> do with it.
> >
> > Ah, yes thanks, that's rather incorrect indeed. How about the following
> > instead? Passes all tests, including the new one.
> >
> > --- a/dir.c
> > +++ b/dir.c
> > @@ -1198,7 +1198,7 @@ static enum path_treatment treat_path(struct dir_struct *dir,
> > return path_none;
> > strbuf_setlen(path, baselen);
> > strbuf_addstr(path, de->d_name);
> > - if (simplify_away(path->buf, path->len, simplify))
> > + if (simplify_away(path->buf, path->len, simplify) || !strncmp(get_git_dir(), path->buf, path->len))
> > return path_none;
>
> get_git_dir() may return a relative or absolute path, depending on
> GIT_DIR/GIT_WORK_TREE. path->buf is always relative. You'll pass one
> case with this (relative vs relative) and fail another. It might be
> simpler to just add get_git_dir(), after converting to relative path
> and check if it's in worktree, to the exclude list and let the current
> exclude mechanism handle it.
This type of invocation really only works from the root of the workdir
anyway and both a relative and absolute path work just fine:
dennis@lightning:~/code/git$ GIT_DIR=$(pwd)/.foo ./git status
On branch master
nothing to commit, working directory clean
dennis@lightning:~/code/git$ GIT_DIR=./.foo ./git status
On branch master
nothing to commit, working directory clean
Well, unless you set GIT_WORK_TREE as well, but then it still works:
dennis@lightning:~/code/git/t$ GIT_DIR=$(pwd)/../.foo GIT_WORK_TREE=.. ../git status
On branch master
nothing to commit, working directory clean
dennis@lightning:~/code/git/t$ GIT_DIR=../.foo GIT_WORK_TREE=.. ../git status
On branch master
nothing to commit, working directory clean
So I'm wondering when you think this will fail. Because then I can add a
test for that case too.
--
Dennis Kaarsemaker
www.kaarsemaker.net
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] path_treatment: also ignore $GIT_DIR if it's not .git
2013-12-02 8:01 ` Dennis Kaarsemaker
@ 2013-12-02 9:35 ` Duy Nguyen
2013-12-02 11:40 ` Dennis Kaarsemaker
0 siblings, 1 reply; 17+ messages in thread
From: Duy Nguyen @ 2013-12-02 9:35 UTC (permalink / raw)
To: Dennis Kaarsemaker; +Cc: Thomas Rast, Git Mailing List, ingy
On Mon, Dec 2, 2013 at 3:01 PM, Dennis Kaarsemaker
<dennis@kaarsemaker.net> wrote:
> On ma, 2013-12-02 at 07:38 +0700, Duy Nguyen wrote:
>> On Mon, Dec 2, 2013 at 6:38 AM, Dennis Kaarsemaker
>> <dennis@kaarsemaker.net> wrote:
>> > On ma, 2013-12-02 at 00:08 +0100, Thomas Rast wrote:
>> >> Duy Nguyen <pclouds@gmail.com> writes:
>> >>
>> >> > On Mon, Dec 2, 2013 at 2:04 AM, Dennis Kaarsemaker
>> >> > <dennis@kaarsemaker.net> wrote:
>> >> >> We always ignore anything named .git, but we should also ignore the git
>> >> >> directory if the user overrides it by setting $GIT_DIR
>> >> [...]
>> >> >> + if (simplify_away(path->buf, path->len, simplify) || is_git_directory(path->buf))
>> >> >> return path_none;
>> >> >
>> >> > this adds 2 access, 1 lstat, 1 open, 1 read, 1 close to _every_ path
>> >> > we check. Is it worth the cost?
>> >>
>> >> Moreover it is a much more inclusive check than what the commit message
>> >> claims: it will ignore anything that looks like a .git directory,
>> >> regardless of the name. In particular GIT_DIR doesn't have anything to
>> >> do with it.
>> >
>> > Ah, yes thanks, that's rather incorrect indeed. How about the following
>> > instead? Passes all tests, including the new one.
>> >
>> > --- a/dir.c
>> > +++ b/dir.c
>> > @@ -1198,7 +1198,7 @@ static enum path_treatment treat_path(struct dir_struct *dir,
>> > return path_none;
>> > strbuf_setlen(path, baselen);
>> > strbuf_addstr(path, de->d_name);
>> > - if (simplify_away(path->buf, path->len, simplify))
>> > + if (simplify_away(path->buf, path->len, simplify) || !strncmp(get_git_dir(), path->buf, path->len))
>> > return path_none;
>>
>> get_git_dir() may return a relative or absolute path, depending on
>> GIT_DIR/GIT_WORK_TREE. path->buf is always relative. You'll pass one
>> case with this (relative vs relative) and fail another. It might be
>> simpler to just add get_git_dir(), after converting to relative path
>> and check if it's in worktree, to the exclude list and let the current
>> exclude mechanism handle it.
>
> This type of invocation really only works from the root of the workdir
> anyway and both a relative and absolute path work just fine:
>
> dennis@lightning:~/code/git$ GIT_DIR=$(pwd)/.foo ./git status
> On branch master
> nothing to commit, working directory clean
> dennis@lightning:~/code/git$ GIT_DIR=./.foo ./git status
> On branch master
> nothing to commit, working directory clean
>
> Well, unless you set GIT_WORK_TREE as well, but then it still works:
>
> dennis@lightning:~/code/git/t$ GIT_DIR=$(pwd)/../.foo GIT_WORK_TREE=.. ../git status
> On branch master
> nothing to commit, working directory clean
> dennis@lightning:~/code/git/t$ GIT_DIR=../.foo GIT_WORK_TREE=.. ../git status
> On branch master
> nothing to commit, working directory clean
>
> So I'm wondering when you think this will fail. Because then I can add a
> test for that case too.
~/w/git $ cd t
~/w/git/t $ GIT_TRACE_SETUP=1 ../git --git-dir=../.git --work-tree=..
--no-pager status
setup: git_dir: /home/pclouds/w/git/.git
setup: worktree: /home/pclouds/w/git
setup: cwd: /home/pclouds/w/git
setup: prefix: t/
On branch exclude-pathspec
Your branch and 'origin/master' have diverged,
and have 2 and 5 different commits each, respectively.
I can't say this is the only case though. One has to audit to all
possible setup cases in setup_git_directory() to make that claim.
--
Duy
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] path_treatment: also ignore $GIT_DIR if it's not .git
2013-12-02 9:35 ` Duy Nguyen
@ 2013-12-02 11:40 ` Dennis Kaarsemaker
2013-12-02 12:01 ` Duy Nguyen
0 siblings, 1 reply; 17+ messages in thread
From: Dennis Kaarsemaker @ 2013-12-02 11:40 UTC (permalink / raw)
To: Duy Nguyen; +Cc: Thomas Rast, Git Mailing List, ingy
On ma, 2013-12-02 at 16:35 +0700, Duy Nguyen wrote:
> On Mon, Dec 2, 2013 at 3:01 PM, Dennis Kaarsemaker
> <dennis@kaarsemaker.net> wrote:
> > On ma, 2013-12-02 at 07:38 +0700, Duy Nguyen wrote:
> >> On Mon, Dec 2, 2013 at 6:38 AM, Dennis Kaarsemaker
> >> <dennis@kaarsemaker.net> wrote:
> >> > On ma, 2013-12-02 at 00:08 +0100, Thomas Rast wrote:
> >> >> Duy Nguyen <pclouds@gmail.com> writes:
> >> >>
> >> >> > On Mon, Dec 2, 2013 at 2:04 AM, Dennis Kaarsemaker
> >> >> > <dennis@kaarsemaker.net> wrote:
> >> >> >> We always ignore anything named .git, but we should also ignore the git
> >> >> >> directory if the user overrides it by setting $GIT_DIR
> >> >> [...]
> >> >> >> + if (simplify_away(path->buf, path->len, simplify) || is_git_directory(path->buf))
> >> >> >> return path_none;
> >> >> >
> >> >> > this adds 2 access, 1 lstat, 1 open, 1 read, 1 close to _every_ path
> >> >> > we check. Is it worth the cost?
> >> >>
> >> >> Moreover it is a much more inclusive check than what the commit message
> >> >> claims: it will ignore anything that looks like a .git directory,
> >> >> regardless of the name. In particular GIT_DIR doesn't have anything to
> >> >> do with it.
> >> >
> >> > Ah, yes thanks, that's rather incorrect indeed. How about the following
> >> > instead? Passes all tests, including the new one.
> >> >
> >> > --- a/dir.c
> >> > +++ b/dir.c
> >> > @@ -1198,7 +1198,7 @@ static enum path_treatment treat_path(struct dir_struct *dir,
> >> > return path_none;
> >> > strbuf_setlen(path, baselen);
> >> > strbuf_addstr(path, de->d_name);
> >> > - if (simplify_away(path->buf, path->len, simplify))
> >> > + if (simplify_away(path->buf, path->len, simplify) || !strncmp(get_git_dir(), path->buf, path->len))
> >> > return path_none;
> >>
> >> get_git_dir() may return a relative or absolute path, depending on
> >> GIT_DIR/GIT_WORK_TREE. path->buf is always relative. You'll pass one
> >> case with this (relative vs relative) and fail another. It might be
> >> simpler to just add get_git_dir(), after converting to relative path
> >> and check if it's in worktree, to the exclude list and let the current
> >> exclude mechanism handle it.
> >
> > This type of invocation really only works from the root of the workdir
> > anyway and both a relative and absolute path work just fine:
> >
> > dennis@lightning:~/code/git$ GIT_DIR=$(pwd)/.foo ./git status
> > On branch master
> > nothing to commit, working directory clean
> > dennis@lightning:~/code/git$ GIT_DIR=./.foo ./git status
> > On branch master
> > nothing to commit, working directory clean
> >
> > Well, unless you set GIT_WORK_TREE as well, but then it still works:
> >
> > dennis@lightning:~/code/git/t$ GIT_DIR=$(pwd)/../.foo GIT_WORK_TREE=.. ../git status
> > On branch master
> > nothing to commit, working directory clean
> > dennis@lightning:~/code/git/t$ GIT_DIR=../.foo GIT_WORK_TREE=.. ../git status
> > On branch master
> > nothing to commit, working directory clean
> >
> > So I'm wondering when you think this will fail. Because then I can add a
> > test for that case too.
>
> ~/w/git $ cd t
> ~/w/git/t $ GIT_TRACE_SETUP=1 ../git --git-dir=../.git --work-tree=..
> --no-pager status
> setup: git_dir: /home/pclouds/w/git/.git
> setup: worktree: /home/pclouds/w/git
> setup: cwd: /home/pclouds/w/git
> setup: prefix: t/
> On branch exclude-pathspec
> Your branch and 'origin/master' have diverged,
> and have 2 and 5 different commits each, respectively.
>
> I can't say this is the only case though. One has to audit to all
> possible setup cases in setup_git_directory() to make that claim.
I'm probably missing something, but that's the same as my second
example, and works. I also tried running it from completely outside the
repo:
dennis@lightning:~$ code/git/git --git-dir=code/git/.foo --work-tree=code/git status
On branch master
nothing to commit, working directory clean
dennis@lightning:~$ code/git/git --git-dir=/home/dennis/code/git/.foo --work-tree=code/git status
On branch master
nothing to commit, working directory clean
--
Dennis Kaarsemaker
www.kaarsemaker.net
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] path_treatment: also ignore $GIT_DIR if it's not .git
2013-12-02 11:40 ` Dennis Kaarsemaker
@ 2013-12-02 12:01 ` Duy Nguyen
0 siblings, 0 replies; 17+ messages in thread
From: Duy Nguyen @ 2013-12-02 12:01 UTC (permalink / raw)
To: Dennis Kaarsemaker; +Cc: Thomas Rast, Git Mailing List, ingy
On Mon, Dec 2, 2013 at 6:40 PM, Dennis Kaarsemaker
<dennis@kaarsemaker.net> wrote:
>> ~/w/git $ cd t
>> ~/w/git/t $ GIT_TRACE_SETUP=1 ../git --git-dir=../.git --work-tree=..
>> --no-pager status
>> setup: git_dir: /home/pclouds/w/git/.git
>> setup: worktree: /home/pclouds/w/git
>> setup: cwd: /home/pclouds/w/git
>> setup: prefix: t/
>> On branch exclude-pathspec
>> Your branch and 'origin/master' have diverged,
>> and have 2 and 5 different commits each, respectively.
>>
>> I can't say this is the only case though. One has to audit to all
>> possible setup cases in setup_git_directory() to make that claim.
>
> I'm probably missing something, but that's the same as my second
> example, and works. I also tried running it from completely outside the
> repo:
>
> dennis@lightning:~$ code/git/git --git-dir=code/git/.foo --work-tree=code/git status
> On branch master
> nothing to commit, working directory clean
> dennis@lightning:~$ code/git/git --git-dir=/home/dennis/code/git/.foo --work-tree=code/git status
> On branch master
> nothing to commit, working directory clean
It looks like we try to convert git_dir relative to work_tree (in
setup_work_tree) so get_git_dir() probably always returns a path
relative to worktree if it's set. I don't know, it looks like so.
--
Duy
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] path_treatment: also ignore $GIT_DIR if it's not .git
2013-12-01 19:04 ` [PATCH] path_treatment: also ignore $GIT_DIR if it's not .git Dennis Kaarsemaker
2013-12-01 23:02 ` Duy Nguyen
2013-12-02 1:21 ` Eric Sunshine
@ 2013-12-03 15:18 ` Karsten Blees
2013-12-03 18:32 ` Junio C Hamano
2 siblings, 1 reply; 17+ messages in thread
From: Karsten Blees @ 2013-12-03 15:18 UTC (permalink / raw)
To: Dennis Kaarsemaker, git; +Cc: ingy
Am 01.12.2013 20:04, schrieb Dennis Kaarsemaker:
> We always ignore anything named .git, but we should also ignore the git
> directory if the user overrides it by setting $GIT_DIR
>
> Reported-By: Ingy döt Net <ingy@ingy.net>
> Signed-off-by: Dennis Kaarsemaker <dennis@kaarsemaker.net>
> ---
> dir.c | 2 +-
> t/t7508-status.sh | 7 +++++++
> 2 files changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/dir.c b/dir.c
> index 23b6de4..884b37d 100644
> --- a/dir.c
> +++ b/dir.c
> @@ -1198,7 +1198,7 @@ static enum path_treatment treat_path(struct dir_struct *dir,
The special case for ".git" is hardcoded in many places in git, including the line immediately above this diff hunk. So I figure that GIT_DIR is not meant to _rename_ the ".git" dir, but to point somewhere _outside_ the worktree (or somewhere within the .git dir).
If we want to support the rename case fully, I think there are a few more questions to answer (and a few more places to change), e.g.:
- What if GIT_DIR=.foo and someone upstream adds a ".foo" directory?
- Should it be possible to track ".git" as a normal file or directory if its not the GIT_DIR?
- What about other commands than status, e.g. does 'git clean -df' leave the GIT_DIR alone?
If we don't want to support this, though, I think it would be more approrpiate to issue a warning if GIT_DIR points to a worktree location.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] path_treatment: also ignore $GIT_DIR if it's not .git
2013-12-03 15:18 ` Karsten Blees
@ 2013-12-03 18:32 ` Junio C Hamano
2013-12-03 19:00 ` Karsten Blees
2013-12-03 19:07 ` Jonathan Nieder
0 siblings, 2 replies; 17+ messages in thread
From: Junio C Hamano @ 2013-12-03 18:32 UTC (permalink / raw)
To: Karsten Blees; +Cc: Dennis Kaarsemaker, git, ingy
Karsten Blees <karsten.blees@gmail.com> writes:
>So I figure that GIT_DIR is not meant to _rename_ the ".git" dir,
>but to point somewhere _outside_ the worktree (or somewhere within
>the .git dir).
Correct.
> If we don't want to support this, though, I think it would be more
> approrpiate to issue a warning if GIT_DIR points to a worktree
> location.
But how do tell what is and isn't a "worktree location"? Having the
path in the index would be one, but you may find it out only after
issuing "git checkout $antient_commit".
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] path_treatment: also ignore $GIT_DIR if it's not .git
2013-12-03 18:32 ` Junio C Hamano
@ 2013-12-03 19:00 ` Karsten Blees
2013-12-03 19:07 ` Jonathan Nieder
1 sibling, 0 replies; 17+ messages in thread
From: Karsten Blees @ 2013-12-03 19:00 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Dennis Kaarsemaker, git, ingy
Am 03.12.2013 19:32, schrieb Junio C Hamano:
> Karsten Blees <karsten.blees@gmail.com> writes:
>
>> So I figure that GIT_DIR is not meant to _rename_ the ".git" dir,
>> but to point somewhere _outside_ the worktree (or somewhere within
>> the .git dir).
>
> Correct.
>
>> If we don't want to support this, though, I think it would be more
>> approrpiate to issue a warning if GIT_DIR points to a worktree
>> location.
>
> But how do tell what is and isn't a "worktree location"? Having the
> path in the index would be one, but you may find it out only after
> issuing "git checkout $antient_commit".
>
In setup_work_tree(), the result of remove_leading_path(git_dir, work_tree) must be absolute or start with ".." or ".git", otherwise warn?
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] path_treatment: also ignore $GIT_DIR if it's not .git
2013-12-03 18:32 ` Junio C Hamano
2013-12-03 19:00 ` Karsten Blees
@ 2013-12-03 19:07 ` Jonathan Nieder
1 sibling, 0 replies; 17+ messages in thread
From: Jonathan Nieder @ 2013-12-03 19:07 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Karsten Blees, Dennis Kaarsemaker, git, ingy
Junio C Hamano wrote:
> Karsten Blees <karsten.blees@gmail.com> writes:
>> If we don't want to support this, though, I think it would be more
>> approrpiate to issue a warning if GIT_DIR points to a worktree
>> location.
>
> But how do tell what is and isn't a "worktree location"? Having the
> path in the index would be one, but you may find it out only after
> issuing "git checkout $antient_commit".
I think the idea was that *any* path under $(git rev-parse
--show-toplevel) would not be a valid GIT_DIR, unless its last path
component is ".git".
Alas, I don't think that would work smoothly.
- Some people may already be using GIT_DIR=$HOME/dotfiles.git to
track some files with a toplevel of $HOME. That is error-prone and
it would be cleaner to either use plain .git or keep the $GIT_DIR
outside the worktree (for example by tucking dotfiles into a
separate $HOME/dotfiles dir), true, but producing a noisy warning
with no way out would not serve these people well.
- There is no outside-the-worktree location when GIT_WORK_TREE=/.
So your suggestion of at least noticing when "git checkout" wants to
write files that overlap with the GIT_DIR seems simpler.
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2013-12-03 19:07 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-12-01 7:06 GIT_DIR not auto ignored Ingy dot Net
2013-12-01 18:08 ` Dennis Kaarsemaker
2013-12-01 18:30 ` Dennis Kaarsemaker
2013-12-01 19:04 ` [PATCH] path_treatment: also ignore $GIT_DIR if it's not .git Dennis Kaarsemaker
2013-12-01 23:02 ` Duy Nguyen
2013-12-01 23:08 ` Thomas Rast
2013-12-01 23:38 ` Dennis Kaarsemaker
2013-12-02 0:38 ` Duy Nguyen
2013-12-02 8:01 ` Dennis Kaarsemaker
2013-12-02 9:35 ` Duy Nguyen
2013-12-02 11:40 ` Dennis Kaarsemaker
2013-12-02 12:01 ` Duy Nguyen
2013-12-02 1:21 ` Eric Sunshine
2013-12-03 15:18 ` Karsten Blees
2013-12-03 18:32 ` Junio C Hamano
2013-12-03 19:00 ` Karsten Blees
2013-12-03 19:07 ` Jonathan Nieder
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).