pass --git-dir when reading git config when it was specified explicitly

Let GIT_DIR and --git-dir override git's protection against operating in a
repository owned by another user.

This is the same behavior other git commands have.

Sponsored-by: Jarkko Kniivilä on Patreon
This commit is contained in:
Joey Hess 2022-09-26 14:38:34 -04:00
parent 1d47a7e7e6
commit bfa451fc4e
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
3 changed files with 19 additions and 9 deletions

View file

@ -38,6 +38,8 @@ git-annex (10.20220823) UNRELEASED; urgency=medium
* Run annex.freezecontent-command and annex.thawcontent-command * Run annex.freezecontent-command and annex.thawcontent-command
when on a crippled filesystem. when on a crippled filesystem.
Thanks, Reiko Asakura Thanks, Reiko Asakura
* Let GIT_DIR and --git-dir override git's protection against operating
in a repository owned by another user.
-- Joey Hess <id@joeyh.name> Mon, 29 Aug 2022 15:03:04 -0400 -- Joey Hess <id@joeyh.name> Mon, 29 Aug 2022 15:03:04 -0400

View file

@ -57,12 +57,20 @@ reRead r = read' $ r
read' :: Repo -> IO Repo read' :: Repo -> IO Repo
read' repo = go repo read' repo = go repo
where where
go Repo { location = Local { gitdir = d } } = git_config d go Repo { location = Local { gitdir = d } } = git_config True d
go Repo { location = LocalUnknown d } = git_config d go Repo { location = LocalUnknown d } = git_config False d
go _ = assertLocal repo $ error "internal" go _ = assertLocal repo $ error "internal"
git_config d = withCreateProcess p (git_config' p) git_config isgitdir d = withCreateProcess p (git_config' p)
where where
params = ["config", "--null", "--list"] params =
-- Passing --git-dir changes git's behavior
-- when run in a repository belonging to another
-- user. When a gitdir is known, pass that in order
-- to get the local git config.
(if isgitdir && gitDirSpecifiedExplicitly repo
then ["--git-dir=."]
else [])
++ ["config", "--null", "--list"]
p = (proc "git" params) p = (proc "git" params)
{ cwd = Just (fromRawFilePath d) { cwd = Just (fromRawFilePath d)
, env = gitEnv repo , env = gitEnv repo

View file

@ -79,11 +79,11 @@ get = do
{ gitdir = absd { gitdir = absd
, worktree = Just curr , worktree = Just curr
} }
r <- Git.Config.read $ newFrom loc r <- Git.Config.read $ (newFrom loc)
let r' = r { gitDirSpecifiedExplicitly = True } { gitDirSpecifiedExplicitly = True }
return $ if Git.Config.isBare r' return $ if Git.Config.isBare r
then r' { location = (location r) { worktree = Nothing } } then r { location = (location r) { worktree = Nothing } }
else r' else r
configure Nothing Nothing = giveup "Not in a git repository." configure Nothing Nothing = giveup "Not in a git repository."
addworktree w r = changelocation r $ Local addworktree w r = changelocation r $ Local