annex.merge-annex-branches

Added annex.merge-annex-branches config setting which can be used to
disable automatic merge of git-annex branches.

I wonder if git-annex merge/sync/assistant should disable this
setting? Not sure yet, so have not done so. May be that users will not set
it in git config, but pass it via -c to commands that need it.

Checking the config setting adds a very small overhead, but it's
only checked once per command so should be insignificant.

This commit was supported by the NSF-funded DataLad project.
This commit is contained in:
Joey Hess 2018-02-22 14:25:32 -04:00
parent addb91b24b
commit 09e73a3ab6
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
6 changed files with 59 additions and 6 deletions

View file

@ -140,7 +140,13 @@ forceUpdate = updateTo =<< siblingBranches
- Returns True if any refs were merged in, False otherwise. - Returns True if any refs were merged in, False otherwise.
-} -}
updateTo :: [(Git.Sha, Git.Branch)] -> Annex Bool updateTo :: [(Git.Sha, Git.Branch)] -> Annex Bool
updateTo pairs = do updateTo pairs = ifM (annexMergeAnnexBranches <$> Annex.getGitConfig)
( updateTo' pairs
, return False
)
updateTo' :: [(Git.Sha, Git.Branch)] -> Annex Bool
updateTo' pairs = do
-- ensure branch exists, and get its current ref -- ensure branch exists, and get its current ref
branchref <- getBranch branchref <- getBranch
dirty <- journalDirty dirty <- journalDirty

View file

@ -26,6 +26,8 @@ git-annex (6.20180113) UNRELEASED; urgency=medium
log. log.
* importfeed: Fix a failure when downloading with youtube-dl * importfeed: Fix a failure when downloading with youtube-dl
and the destination subdirectory does not exist yet. and the destination subdirectory does not exist yet.
* Added annex.merge-annex-branches config setting which
can be used to disable automatic merge of git-annex branches.
-- Joey Hess <id@joeyh.name> Wed, 24 Jan 2018 20:42:55 -0400 -- Joey Hess <id@joeyh.name> Wed, 24 Jan 2018 20:42:55 -0400

View file

@ -59,6 +59,7 @@ data GitConfig = GitConfig
, annexBloomAccuracy :: Maybe Int , annexBloomAccuracy :: Maybe Int
, annexSshCaching :: Maybe Bool , annexSshCaching :: Maybe Bool
, annexAlwaysCommit :: Bool , annexAlwaysCommit :: Bool
, annexMergeAnnexBranches :: Bool
, annexDelayAdd :: Maybe Int , annexDelayAdd :: Maybe Int
, annexHttpHeaders :: [String] , annexHttpHeaders :: [String]
, annexHttpHeadersCommand :: Maybe String , annexHttpHeadersCommand :: Maybe String
@ -116,6 +117,7 @@ extractGitConfig r = GitConfig
, annexBloomAccuracy = getmayberead (annex "bloomaccuracy") , annexBloomAccuracy = getmayberead (annex "bloomaccuracy")
, annexSshCaching = getmaybebool (annex "sshcaching") , annexSshCaching = getmaybebool (annex "sshcaching")
, annexAlwaysCommit = getbool (annex "alwayscommit") True , annexAlwaysCommit = getbool (annex "alwayscommit") True
, annexMergeAnnexBranches = getbool (annex "merge-annex-branches") True
, annexDelayAdd = getmayberead (annex "delayadd") , annexDelayAdd = getmayberead (annex "delayadd")
, annexHttpHeaders = getlist (annex "http-headers") , annexHttpHeaders = getlist (annex "http-headers")
, annexHttpHeadersCommand = getmaybe (annex "http-headers-command") , annexHttpHeadersCommand = getmaybe (annex "http-headers-command")

View file

@ -0,0 +1,33 @@
[[!comment format=mdwn
username="joey"
subject="""comment 3"""
date="2018-02-22T17:27:06Z"
content="""
There are situations where a git command that appears to be read-only,
such as `git status` actually writes to the repository behind the scenes.
It looks like git ignores write errors in at least some such cases. So
there is precident for implicit read-only support, but I think not in cases
where it would involve significant behavior changes, like it would for the
git-annex branch auto-merging. In git's case the behavior change probably
only involves repeated `git status` runs being slower than otherwise,
or something like that.
As well as populating the .git/annex/index file with information merged in from
recently fetched git-annex branches, git-annex may need to write to other files
in order to prepare caches needed to perform what appears to be "read-only"
query operation, or to lock files in order to prevent someone who does have
write access from dropping them in a situation where that will lose data.
An example of the latter is running `git annex drop` in a repository you do have
write access to, and it needing to exclusively lock files in origin,
which requires write access to origin as well. Without write access,
the drop may fail.
The --read-only flag seems to be setting up a situation where git-annex handles
some things being read-only, but then someone expects the flag to
make some other thing work read-only, which git-annex can't manage to support
for whatever reason.
So I prefer a more specific name, like annex.merge-annex-branches=false.
Implemented that.
"""]]

View file

@ -34,9 +34,9 @@ These settings can be overridden on a per-repository basis using
* `annex.resolvemerge` * `annex.resolvemerge`
Set to false to prevent merge conflicts being automatically resolved Set to false to prevent merge conflicts in the checked out branch
by the git-annex assitant, git-annex sync, git-annex merge, being automatically resolved by the git-annex assitant,
and the git-annex post-receive hook. git-annex sync, git-annex merge, and the git-annex post-receive hook.
* `annex.synccontent` * `annex.synccontent`

View file

@ -974,6 +974,15 @@ Here are all the supported configuration settings.
since it could garbage collect objects that are staged in git-annex's since it could garbage collect objects that are staged in git-annex's
index but not yet committed. index but not yet committed.
* `annex.merge-annex-branches`
By default, git-annex branches that have been pulled from remotes
are automatically merged into the local git-annex branch, so that
git-annex has the most up-to-date possible knowledge.
To avoid that merging, set this to "false". This can be useful
particularly when you don't have write permission to the repository.
* `annex.hardlink` * `annex.hardlink`
Set this to `true` to make file contents be hard linked between the Set this to `true` to make file contents be hard linked between the
@ -1054,8 +1063,9 @@ Here are all the supported configuration settings.
* `annex.resolvemerge` * `annex.resolvemerge`
Set to false to prevent merge conflicts being automatically resolved Set to false to prevent merge conflicts in the checked out branch
by the git-annex assitant, git-annex sync, git-annex merge, being automatically resolved by the git-annex assitant,
git-annex sync, git-annex merge,
and the git-annex post-receive hook. and the git-annex post-receive hook.
To configure the behavior in all clones of the repository, To configure the behavior in all clones of the repository,