git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
* git aliases and GIT_PREFIX
@ 2021-10-28 19:03 Federico Kircheis
  2021-10-29 10:59 ` Ævar Arnfjörð Bjarmason
  2021-11-02 14:26 ` Johannes Schindelin
  0 siblings, 2 replies; 5+ messages in thread
From: Federico Kircheis @ 2021-10-28 19:03 UTC (permalink / raw)
  To: git


Hello to everyone,

today I reported what I believed to be a bug on

  https://github.com/git-for-windows/git/issues/3496

and learned about GIT_DIR when working with aliases and git worktree.



It's annoying that GIT_DIR it is defined only if (as far as I've 
understood) working from a worktrees or submodule, as it does not seem 
to be related to those type of repositories.

This is also irritating because apparently working aliases breaks when 
being executed from those repositories.


I believe it would be better if GIT_DIR it's either always set or never 
(could someone enlighten me why the variable is needed in first place?).

If it is consistently set, it would make it much easier to notice that 
an alias is actually broken.



Best

Federico


PS: I'm not subscribed to the mailing list (yet), so please keep me in CC.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: git aliases and GIT_PREFIX
  2021-10-28 19:03 git aliases and GIT_PREFIX Federico Kircheis
@ 2021-10-29 10:59 ` Ævar Arnfjörð Bjarmason
  2021-11-02 14:26 ` Johannes Schindelin
  1 sibling, 0 replies; 5+ messages in thread
From: Ævar Arnfjörð Bjarmason @ 2021-10-29 10:59 UTC (permalink / raw)
  To: Federico Kircheis; +Cc: git


On Thu, Oct 28 2021, Federico Kircheis wrote:

> Hello to everyone,
>
> today I reported what I believed to be a bug on
>
>  https://github.com/git-for-windows/git/issues/3496
>
> and learned about GIT_DIR when working with aliases and git worktree.
>
>
>
> It's annoying that GIT_DIR it is defined only if (as far as I've
> understood) working from a worktrees or submodule, as it does not seem 
> to be related to those type of repositories.
>
> This is also irritating because apparently working aliases breaks when
> being executed from those repositories.
>
>
> I believe it would be better if GIT_DIR it's either always set or
> never (could someone enlighten me why the variable is needed in first
> place?).

I don't know the full story, but a good place to start is to apply this
patch:

diff --git a/cache.h b/cache.h
index eba12487b99..84d4c8da167 100644
--- a/cache.h
+++ b/cache.h
@@ -486,7 +486,7 @@ static inline enum object_type object_type(unsigned int mode)
 }
 
 /* Double-check local_repo_env below if you add to this list. */
-#define GIT_DIR_ENVIRONMENT "GIT_DIR"
+#define GIT_DIR_ENVIRONMENT "POISON_GIT_DIR"
 #define GIT_COMMON_DIR_ENVIRONMENT "GIT_COMMON_DIR"
 #define GIT_NAMESPACE_ENVIRONMENT "GIT_NAMESPACE"
 #define GIT_WORK_TREE_ENVIRONMENT "GIT_WORK_TREE"

If you then run the full test suite that comes with git you should get a
pretty good picture of why/how not having GIT_DIR breaks.

Surely some of those reasons are fixable, e.g. are we invoking our own
"git" with "GIT_DIR=<path> git [...]", then we can just use "git
--git-dir=<path>", some of the others might be tricky.

When I did that the failed tests were the following:

Test Summary Report
-------------------
t9401-git-cvsserver-crlf.sh                      (Wstat: 256 Tests: 18 Failed: 16)
  Failed tests:  2-8, 10-18
  Non-zero exit status: 1
t9400-git-cvsserver-server.sh                    (Wstat: 256 Tests: 45 Failed: 23)
  Failed tests:  2, 20, 22-25, 27-41, 43, 45
  Non-zero exit status: 1
t9200-git-cvsexportcommit.sh                     (Wstat: 256 Tests: 15 Failed: 13)
  Failed tests:  1-2, 4-8, 10-15
  Non-zero exit status: 1
t9402-git-cvsserver-refs.sh                      (Wstat: 256 Tests: 37 Failed: 25)
  Failed tests:  7-12, 14-24, 27-29, 31-32, 34, 36-37
  Non-zero exit status: 1
t5516-fetch-push.sh                              (Wstat: 256 Tests: 103 Failed: 3)
  Failed tests:  101-103
  Non-zero exit status: 1
t5500-fetch-pack.sh                              (Wstat: 256 Tests: 373 Failed: 6)
  Failed tests:  7, 38-42
  Non-zero exit status: 1
t7003-filter-branch.sh                           (Wstat: 256 Tests: 48 Failed: 10)
  Failed tests:  6-7, 9-14, 16, 19
  Non-zero exit status: 1
t7406-submodule-update.sh                        (Wstat: 256 Tests: 57 Failed: 1)
  Failed test:  13
  Non-zero exit status: 1
t9902-completion.sh                              (Wstat: 256 Tests: 212 Failed: 2)
  Failed tests:  11-12
  Non-zero exit status: 1
t5601-clone.sh                                   (Wstat: 256 Tests: 107 Failed: 3)
  Failed tests:  12-13, 35
  Non-zero exit status: 1
t1510-repo-setup.sh                              (Wstat: 256 Tests: 109 Failed: 26)
  Failed tests:  3-4, 6, 8-9, 14-17, 21, 23-24, 29-30, 55
                57, 59-60, 67, 69-70, 73-74, 78, 80-81
  Non-zero exit status: 1
t5310-pack-bitmaps.sh                            (Wstat: 256 Tests: 73 Failed: 1)
  Failed test:  48
  Non-zero exit status: 1
t5401-update-hooks.sh                            (Wstat: 256 Tests: 13 Failed: 9)
  Failed tests:  3-10, 12
  Non-zero exit status: 1
t5531-deep-submodule-push.sh                     (Wstat: 256 Tests: 27 Failed: 22)
  Failed tests:  2-3, 5-15, 18-20, 22-27
  Non-zero exit status: 1
t2400-worktree-add.sh                            (Wstat: 256 Tests: 71 Failed: 2)
  Failed tests:  61-62
  Non-zero exit status: 1
t3430-rebase-merges.sh                           (Wstat: 256 Tests: 25 Failed: 1)
  Failed test:  11
  Non-zero exit status: 1
t5801-remote-helpers.sh                          (Wstat: 256 Tests: 31 Failed: 28)
  Failed tests:  2, 4-17, 19-31
  Non-zero exit status: 1
t7401-submodule-summary.sh                       (Wstat: 256 Tests: 23 Failed: 1)
  Failed test:  14
  Non-zero exit status: 1
t0001-init.sh                                    (Wstat: 256 Tests: 61 Failed: 3)
  Failed tests:  10, 13, 36
  Non-zero exit status: 1
t1500-rev-parse.sh                               (Wstat: 256 Tests: 75 Failed: 7)
  Failed tests:  35-36, 45, 49-51, 59
  Non-zero exit status: 1
t1501-work-tree.sh                               (Wstat: 256 Tests: 39 Failed: 19)
  Failed tests:  4-7, 9-11, 13-15, 17-18, 24-26, 31, 33-34
                39
  Non-zero exit status: 1
t5509-fetch-push-namespaces.sh                   (Wstat: 256 Tests: 14 Failed: 1)
  Failed test:  14
  Non-zero exit status: 1
t4201-shortlog.sh                                (Wstat: 256 Tests: 25 Failed: 1)
  Failed test:  9
  Non-zero exit status: 1
t5519-push-alternates.sh                         (Wstat: 256 Tests: 8 Failed: 8)
  Failed tests:  1-8
  Non-zero exit status: 1
t6060-merge-index.sh                             (Wstat: 256 Tests: 7 Failed: 2)
  Failed tests:  6-7
  Non-zero exit status: 1
t7409-submodule-detached-work-tree.sh            (Wstat: 256 Tests: 2 Failed: 2)
  Failed tests:  1-2
  Non-zero exit status: 1
t5403-post-checkout-hook.sh                      (Wstat: 256 Tests: 8 Failed: 1)
  Failed test:  8
  Non-zero exit status: 1
t2201-add-update-typechange.sh                   (Wstat: 256 Tests: 6 Failed: 2)
  Failed tests:  5-6
  Non-zero exit status: 1
t5402-post-merge-hook.sh                         (Wstat: 256 Tests: 6 Failed: 4)
  Failed tests:  3-6
  Non-zero exit status: 1
t1515-rev-parse-outside-repo.sh                  (Wstat: 256 Tests: 4 Failed: 1)
  Failed test:  3
  Non-zero exit status: 1
Files=940, Tests=24858, 144 wallclock secs ( 6.34 usr  1.64 sys + 654.49 cusr 307.66 csys = 970.13 CPU)
Result: FAIL
make: *** [Makefile:53: prove] Error 1

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: git aliases and GIT_PREFIX
  2021-10-28 19:03 git aliases and GIT_PREFIX Federico Kircheis
  2021-10-29 10:59 ` Ævar Arnfjörð Bjarmason
@ 2021-11-02 14:26 ` Johannes Schindelin
  2021-11-02 17:26   ` Federico Kircheis
  1 sibling, 1 reply; 5+ messages in thread
From: Johannes Schindelin @ 2021-11-02 14:26 UTC (permalink / raw)
  To: Federico Kircheis; +Cc: git

Hi Federico,

On Thu, 28 Oct 2021, Federico Kircheis wrote:

> today I reported what I believed to be a bug on
>
>  https://github.com/git-for-windows/git/issues/3496
>
> and learned about GIT_DIR when working with aliases and git worktree.
>
> It's annoying that GIT_DIR it is defined only if (as far as I've understood)
> working from a worktrees or submodule, as it does not seem to be related to
> those type of repositories.

To clarify: `GIT_DIR` is set when executing an alias in a worktree other
than the primary one (and probably also in submodules), but not when
executing in a primary worktree.

> This is also irritating because apparently working aliases breaks when being
> executed from those repositories.

To clarify: an alias that wants to switch to a different repository and
execute Git commands there works well in a primary worktree. But when you
switch to a different repository while executing an alias from a secondary
worktree, it will fail because of `GIT_DIR` having been set.

> I believe it would be better if GIT_DIR it's either always set or never
> (could someone enlighten me why the variable is needed in first place?).

The fact that `GIT_DIR` is not set when calling an alias in a primary
worktree suggests that the behavior in secondary worktrees is not by
design. We should therefore be able to stop setting it there.

The question is: what code is responsible for setting it only in some
circumstances but not others?

Federico, do you have any experience in debugging C code? If so, it would
be good if you could take a crack at investigating this.

Ciao,
Johannes

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: git aliases and GIT_PREFIX
  2021-11-02 14:26 ` Johannes Schindelin
@ 2021-11-02 17:26   ` Federico Kircheis
  2021-11-04  0:02     ` Johannes Schindelin
  0 siblings, 1 reply; 5+ messages in thread
From: Federico Kircheis @ 2021-11-02 17:26 UTC (permalink / raw)
  To: git


Sorry for the late reply.

On Tue, Nov 02, 2021 at 03:26:05PM +0100, Johannes Schindelin wrote:
>Hi Federico,
>
>On Thu, 28 Oct 2021, Federico Kircheis wrote:
>
>> today I reported what I believed to be a bug on
>>
>>  https://github.com/git-for-windows/git/issues/3496
>>
>> and learned about GIT_DIR when working with aliases and git worktree.
>>
>> It's annoying that GIT_DIR it is defined only if (as far as I've understood)
>> working from a worktrees or submodule, as it does not seem to be related to
>> those type of repositories.
>
>To clarify: `GIT_DIR` is set when executing an alias in a worktree other
>than the primary one (and probably also in submodules), but not when
>executing in a primary worktree.
>
>> This is also irritating because apparently working aliases breaks when being
>> executed from those repositories.
>
>To clarify: an alias that wants to switch to a different repository and
>execute Git commands there works well in a primary worktree. But when you
>switch to a different repository while executing an alias from a secondary
>worktree, it will fail because of `GIT_DIR` having been set.
>
>> I believe it would be better if GIT_DIR it's either always set or never
>> (could someone enlighten me why the variable is needed in first place?).

Yes, sorry if I was not clear, your clarification are what I meant to 
say.

>The fact that `GIT_DIR` is not set when calling an alias in a primary
>worktree suggests that the behavior in secondary worktrees is not by
>design. We should therefore be able to stop setting it there.
>
>The question is: what code is responsible for setting it only in some
>circumstances but not others?
>
>Federico, do you have any experience in debugging C code? If so, it would
>be good if you could take a crack at investigating this.
>
>Ciao,
>Johannes

Yes, I have some experience, but never looked at the git codebase.

On GitHub (https://github.com/git-for-windows/git/issues/3496) there is 
already an hint where those variables are set:

   https://github.com/git/git/blob/v2.33.1/git.c#L354

Or do you mean if I could investigate the test cases Ævar Arnfjörð 
Bjarmason mentioned?


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: git aliases and GIT_PREFIX
  2021-11-02 17:26   ` Federico Kircheis
@ 2021-11-04  0:02     ` Johannes Schindelin
  0 siblings, 0 replies; 5+ messages in thread
From: Johannes Schindelin @ 2021-11-04  0:02 UTC (permalink / raw)
  To: Federico Kircheis; +Cc: git

Hi Federico,

On Tue, 2 Nov 2021, Federico Kircheis wrote:

> On Tue, Nov 02, 2021 at 03:26:05PM +0100, Johannes Schindelin wrote:
> >
> >On Thu, 28 Oct 2021, Federico Kircheis wrote:
> >
> > > today I reported what I believed to be a bug on
> > >
> > >  https://github.com/git-for-windows/git/issues/3496
> > >
> > > and learned about GIT_DIR when working with aliases and git worktree.
> > >
> > > It's annoying that GIT_DIR it is defined only if (as far as I've
> > > understood)
> > > working from a worktrees or submodule, as it does not seem to be related
> > > to
> > > those type of repositories.
> >
> >To clarify: `GIT_DIR` is set when executing an alias in a worktree other
> >than the primary one (and probably also in submodules), but not when
> >executing in a primary worktree.
> >
> > > This is also irritating because apparently working aliases breaks when
> > > being
> > > executed from those repositories.
> >
> >To clarify: an alias that wants to switch to a different repository and
> >execute Git commands there works well in a primary worktree. But when you
> >switch to a different repository while executing an alias from a secondary
> >worktree, it will fail because of `GIT_DIR` having been set.
> >
> > > I believe it would be better if GIT_DIR it's either always set or never
> > > (could someone enlighten me why the variable is needed in first place?).
>
> Yes, sorry if I was not clear, your clarification are what I meant to say.
>
> >The fact that `GIT_DIR` is not set when calling an alias in a primary
> >worktree suggests that the behavior in secondary worktrees is not by
> >design. We should therefore be able to stop setting it there.
> >
> >The question is: what code is responsible for setting it only in some
> >circumstances but not others?
> >
> >Federico, do you have any experience in debugging C code? If so, it would
> >be good if you could take a crack at investigating this.
> >
> >Ciao,
> >Johannes
>
> Yes, I have some experience, but never looked at the git codebase.
>
> On GitHub (https://github.com/git-for-windows/git/issues/3496) there is
> already an hint where those variables are set:
>
>   https://github.com/git/git/blob/v2.33.1/git.c#L354

Well, that's a call to `setup_git_directory_gently()`, and obviously we
already know a couple of scenarios where the `GIT_DIR` environment
variable is _not_ set in this function.

Unfortunately, this function is a bit long and calls other functions, too:
https://github.com/git/git/blob/v2.33.1/setup.c#L1206-L1339

I actually believe that the `GIT_DIR` is set (_when_ it is set) in
`set_git_dir_1()`:
https://github.com/git/git/blob/v2.33.1/environment.c#L332. This function
is called, unconditionally, in `set_git_dir()`, so my best bet is that the
`set_git_dir()` function calls in `setup_git_directory_gently()` are the
reason why `GIT_DIR` is set sometimes, but not always.

And it is further my suspicion that calls to `set_git_dir()` are used to
potentially turn a relative path into an absolute one, by passing a
non-zero value for `make_realpath`. And this might be the reason for the
calls in the first place, not the `GIT_DIR` variable.

So the first step would probably be to write a test case (see the scripts
in t/) that creates a secondary worktree, then calls an alias that
verifies that `GIT_DIR` is not set when run in that worktree. This test
case would be marked with `test_expect_failure`.

Then, you need to debug that test case (e.g. by using the `debug` function
to run a given Git command through `gdb` and then setting a breakpoint on
`setenv()`). Once you have the call path of the offending `setenv()`, you
might find an elegant way to avoid setting the environment variable.

On the other hand, you could also simply unset `GIT_DIR` and friends
explicitly, by adding something like this after
https://github.com/git/git/blob/v2.33.1/git.c#L364:

	strvec_push(&child.env, "GIT_DIR");

But then, you might actually break things. The `GIT_PREFIX` variable is
required to let aliases know in which subdirectory (if any) they were
started. For example, if you run this command in Git's `Documentation/`
directory, it will actually print the path of the top-level directory:

	git -c alias.pwd='!pwd' pwd

This is long-established behavior, and the only way to go back to the
directory from where the alias was started is to call `cd "$GIT_PREFIX"`.
That's behavior, therefore, that you cannot change.

And if `GIT_PREFIX` needs to be set, maybe there are scenarios where
`GIT_DIR` actually _does_ need to be set?

Hopefully these explanations make some sense to you.

Ciao,
Johannes

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-11-04  0:02 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-28 19:03 git aliases and GIT_PREFIX Federico Kircheis
2021-10-29 10:59 ` Ævar Arnfjörð Bjarmason
2021-11-02 14:26 ` Johannes Schindelin
2021-11-02 17:26   ` Federico Kircheis
2021-11-04  0:02     ` Johannes Schindelin

Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

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 read-only IMAP folder(s) and NNTP newsgroup(s).