Skip to contentSkip to conversation

core.hooksPath cannot revert to the default locally

DISCUSSION Sam Newbold 3 participants 5 messages Oct 16, 2024 – Oct 17, 2024

lore
Share & tools
lore
#0 lore raw

From my testing, reading the documentation and hunting through the source code, it appears that if a system administrator sets the --system core.hooksPath or a script over which you have limited control sets the --global core.hooksPath, then there is no way for an individual repository to configure --local core.hooksPath to get the default behavior. The naive solution of setting core.hooksPath to be .git/hooks breaks in the case of worktrees.

I would be happy to code a patch for this if I knew how it should be configured. Obviously, no local setting for a config variable is meant to inherit the global or system value. We can go all "set of the null set" by making the empty string mean "revert to default". We could go fancy "I know what you really mean" by interpreting ".git/hooks" (or perhaps any path beginning with ".git") not literally in the case of worktrees, but as relative to GIT_DIR. Or there could be another setting set on a local repository to ignore global and system values of core.hooksPath.

Thank you,
Sam Newbold

#1 lore raw

Hi Sam

Quoted 7 lines · Sam Newbold

From my testing, reading the documentation and hunting through the
source code, it appears that if a system administrator sets the --system core.hooksPath or a script over which you have limited control sets the --global core.hooksPath, then there is no way for an individual repository to configure --local core.hooksPath to get the default behavior. The naive solution of setting core.hooksPath to be .git/hooks breaks in the case of worktrees.

I'm pretty sure I've used "git -c core.hookspath=/dev/null ..." in the past when I've wanted to temporarily disable my hooks path, I can't find anything in the documentation though. If

git config core.hookspath /dev/null

does work for you it would be really helpful to update the documentation.

Best Wishes

Phillip

Quoted 13 lines

I would be happy to code a patch for this if I knew how it should be configured. Obviously, no local setting for a config variable is meant to inherit the global or system value. We can go all "set of the null set" by making the empty string mean "revert to default". We could go fancy "I know what you really mean" by interpreting ".git/hooks" (or perhaps any path beginning with ".git") not literally in the case of worktrees, but as relative to GIT_DIR. Or there could be another setting set on a local repository to ignore global and system values of core.hooksPath.

Thank you,
Sam Newbold

#2 lore raw
Quoted 1 line · Phillip Wood

I'm pretty sure I've used "git -c core.hookspath=/dev/null ..."

Looking at the code that will unfortunately disable all hooks including the ones in .git/hooks. It would make sense to allow an empty core.hooksPath mean "use .git/hooks". If you're interested in working on this then I think doing something like

config.c +4 -1
index a11bb85da30..91f190a1ce1 100644
@@ -1437,7 +1437,10 @@ static int git_default_core_config(const char *var, const char *value,
 
         if (!strcmp(var, "core.hookspath")) {
                 FREE_AND_NULL(git_hooks_path);
-                return git_config_pathname(&git_hooks_path, var, value);
+                if (value)
+                        return git_config_pathname(&git_hooks_path, var, value);
+                else
+                        return 0;
         }
 
         if (!strcmp(var, "core.bare")) {

would be a good starting point

Best Wishes

Phillip

Quoted 24 lines

in the past when I've wanted to temporarily disable my hooks path, I can't find anything in the documentation though. If

    git config core.hookspath /dev/null

does work for you it would be really helpful to update the documentation.

Best Wishes

Phillip

Quoted 13 lines

I would be happy to code a patch for this if I knew how it should be configured. Obviously, no local setting for a config variable is meant to inherit the global or system value. We can go all "set of the null set" by making the empty string mean "revert to default". We could go fancy "I know what you really mean" by interpreting ".git/hooks" (or perhaps any path beginning with ".git") not literally in the case of worktrees, but as relative to GIT_DIR. Or there could be another setting set on a local repository to ignore global and system values of core.hooksPath.

Thank you,
Sam Newbold

#3 lore raw
Quoted 7 lines · Phillip Wood
Quoted 1 line · Phillip Wood

I'm pretty sure I've used "git -c core.hookspath=/dev/null ..."

Looking at the code that will unfortunately disable all hooks including the ones in .git/hooks. It would make sense to allow an empty core.hooksPath mean "use .git/hooks". If you're interested in working on this then I think doing something like

Thanks for providing a helpful suggestion.

I agree that the behavior you suggested here when specifying an empty value for 'core.hooksPath' would be an improvement here as a means to override system/global-level configuration.

config.c static int git_default_core_config(const char *var, const char *value, · line 1439

Quoted 9 lines
config.c +1 -1
index a11bb85da30..91f190a1ce1 100644
@@ -1437,7 +1437,10 @@ static int git_default_core_config(const char *var, const char *value,
         if (!strcmp(var, "core.hookspath")) {
                 FREE_AND_NULL(git_hooks_path);
-                return git_config_pathname(&git_hooks_path, var, value);
+                if (value)

I think this should read "if (value && *value)" instead, to ensure that things like:

git -c core.hooksPath= ...

work as expected.

Thanks,
Taylor

#4 lore raw

Great! I'll reply to this thread when I have some code to be reviewed.

Quoted 34 lines · Taylor Blau
Quoted 7 lines · Phillip Wood
Quoted 1 line · Phillip Wood

I'm pretty sure I've used "git -c core.hookspath=/dev/null ..."

Looking at the code that will unfortunately disable all hooks including the ones in .git/hooks. It would make sense to allow an empty core.hooksPath mean "use .git/hooks". If you're interested in working on this then I think doing something like

Thanks for providing a helpful suggestion.

I agree that the behavior you suggested here when specifying an empty value for 'core.hooksPath' would be an improvement here as a means to override system/global-level configuration.

config.c static int git_default_core_config(const char *var, const char *value, · line 1439

Quoted 9 lines
config.c +1 -1
index a11bb85da30..91f190a1ce1 100644
@@ -1437,7 +1437,10 @@ static int git_default_core_config(const char *var, const char *value,
         if (!strcmp(var, "core.hookspath")) {
                 FREE_AND_NULL(git_hooks_path);
-                return git_config_pathname(&git_hooks_path, var, value);
+                if (value)

I think this should read "if (value && *value)" instead, to ensure that things like:

git -c core.hooksPath= ...

work as expected.

Thanks,
Taylor