a78eb6dd58
* Added sync --only-annex, which syncs the git-annex branch and annexed content but leaves managing the other git branches up to you. * Added annex.synconlyannex git config setting, which can also be set with git-annex config to configure sync in all clones of the repo. Use case is then the user has their own git workflow, and wants to use git-annex without disrupting that, so they sync --only-annex to get the git-annex stuff in sync in addition to their usual git workflow. When annex.synconlyannex is set, --not-only-annex can be used to override it. It's not entirely clear what --only-annex --commit or --only-annex --push should do, and I left that combination not documented because I don't know if I might want to change the current behavior, which is that such options do not override the --only-annex. My gut feeling is that there is no good reasons to use such combinations; if you want to use your own git workflow, you'll be doing your own committing and pulling and pushing. A subtle question is, how should import/export special remotes be handled? Importing updates their remote tracking branch and merges it into master. If --only-annex prevented that git branch stuff, then it would prevent exporting to the special remote, in the case where it has changes that were not imported yet, because there would be a unresolved conflict. I decided that it's best to treat the fact that there's a remote tracking branch for import/export as an implementation detail in this case. The more important thing is that an import/export special remote is entirely annexed content, and so it makes a lot of sense that --only-annex will still sync with it.
45 lines
1.3 KiB
Haskell
45 lines
1.3 KiB
Haskell
{- git-annex command
|
|
-
|
|
- Copyright 2011-2019 Joey Hess <id@joeyh.name>
|
|
-
|
|
- Licensed under the GNU AGPL version 3 or higher.
|
|
-}
|
|
|
|
module Command.Merge where
|
|
|
|
import Command
|
|
import qualified Annex.Branch
|
|
import qualified Git
|
|
import qualified Git.Branch
|
|
import Annex.CurrentBranch
|
|
import Command.Sync (prepMerge, mergeLocal, mergeConfig, merge, SyncOptions(..))
|
|
|
|
cmd :: Command
|
|
cmd = command "merge" SectionMaintenance
|
|
"merge changes from remotes"
|
|
(paramOptional paramRef) (withParams seek)
|
|
|
|
seek :: CmdParams -> CommandSeek
|
|
seek [] = do
|
|
prepMerge
|
|
commandAction mergeAnnexBranch
|
|
commandAction mergeSyncedBranch
|
|
seek bs = do
|
|
prepMerge
|
|
forM_ bs (commandAction . mergeBranch . Git.Ref)
|
|
|
|
mergeAnnexBranch :: CommandStart
|
|
mergeAnnexBranch = starting "merge" (ActionItemOther (Just "git-annex")) $ do
|
|
Annex.Branch.update
|
|
-- commit explicitly, in case no remote branches were merged
|
|
Annex.Branch.commit =<< Annex.Branch.commitMessage
|
|
next $ return True
|
|
|
|
mergeSyncedBranch :: CommandStart
|
|
mergeSyncedBranch = mergeLocal mergeConfig def =<< getCurrentBranch
|
|
|
|
mergeBranch :: Git.Ref -> CommandStart
|
|
mergeBranch r = starting "merge" (ActionItemOther (Just (Git.fromRef r))) $ do
|
|
currbranch <- getCurrentBranch
|
|
let o = def { notOnlyAnnexOption = True }
|
|
next $ merge currbranch mergeConfig o Git.Branch.ManualCommit r
|