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:
parent
1d47a7e7e6
commit
bfa451fc4e
3 changed files with 19 additions and 9 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue