* 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).