use disconnected history for import tracking branch

This avoids the first merge from it deleting all files in the current
branch, which was very surpring and unwanted behavior.
This commit is contained in:
Joey Hess 2019-03-01 14:32:45 -04:00
parent 740f957cef
commit d28b0a8bd0
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
4 changed files with 27 additions and 33 deletions

View file

@ -247,10 +247,15 @@ seekRemote :: Remote -> Branch -> Maybe TopFilePath -> CommandSeek
seekRemote remote branch msubdir = allowConcurrentOutput $ do seekRemote remote branch msubdir = allowConcurrentOutput $ do
importtreeconfig <- case msubdir of importtreeconfig <- case msubdir of
Nothing -> return ImportTree Nothing -> return ImportTree
Just subdir -> frombranch Git.Ref.tree >>= \case Just subdir ->
let mk tree = pure $ ImportSubTree subdir tree
in fromtrackingbranch Git.Ref.tree >>= \case
Just tree -> mk tree
Nothing -> inRepo (Git.Ref.tree branch) >>= \case
Just tree -> mk tree
Nothing -> giveup $ "Unable to find base tree for branch " ++ fromRef branch Nothing -> giveup $ "Unable to find base tree for branch " ++ fromRef branch
Just tree -> pure $ ImportSubTree subdir tree
parentcommit <- frombranch Git.Ref.sha parentcommit <- fromtrackingbranch Git.Ref.sha
let importcommitconfig = ImportCommitConfig parentcommit ManualCommit importmessage let importcommitconfig = ImportCommitConfig parentcommit ManualCommit importmessage
importable <- download importtreeconfig =<< enumerate importable <- download importtreeconfig =<< enumerate
@ -258,12 +263,10 @@ seekRemote remote branch msubdir = allowConcurrentOutput $ do
commitRemote remote branch tb parentcommit importtreeconfig importcommitconfig importable commitRemote remote branch tb parentcommit importtreeconfig importcommitconfig importable
where where
importmessage = "import from " ++ Remote.name remote importmessage = "import from " ++ Remote.name remote
tb = mkRemoteTrackingBranch remote branch tb = mkRemoteTrackingBranch remote branch
-- If the remote tracking branch already exists, get from it,
-- otherwise get from the branch. fromtrackingbranch a = inRepo $ a (fromRemoteTrackingBranch tb)
frombranch a = inRepo (a (fromRemoteTrackingBranch tb)) >>= \case
Just v -> return (Just v)
Nothing -> inRepo (a branch)
enumerate = do enumerate = do
showStart' "import" (Just (Remote.name remote)) showStart' "import" (Just (Remote.name remote))

View file

@ -43,6 +43,9 @@ paragraph do not apply. Note that dropping content from such a remote is
not supported. See individual special remotes' documentation for not supported. See individual special remotes' documentation for
details of how to enable such versioning. details of how to enable such versioning.
You can combine using `git annex export` to send changes to a special
remote with `git annex import` to fetch changes from a special remote.
The `git annex sync --content` command (and the git-annex assistant) The `git annex sync --content` command (and the git-annex assistant)
can also be used to export a branch to a special remote, can also be used to export a branch to a special remote,
updating the special remote whenever the branch is changed. updating the special remote whenever the branch is changed.

View file

@ -24,7 +24,11 @@ This way, something can be using the special remote for file storage,
adding files, modifying files, and deleting files, and you can track those adding files, modifying files, and deleting files, and you can track those
changes using git-annex. changes using git-annex.
This can only be used with special remotes that were configured with You can combine using `git annex import` to fetch changes from a special
remote with `git annex export` to send your local changes to the special
remote.
You can only import from special remotes that were configured with
`importtree=yes` when set up with [[git-annex-initremote]](1). Only some `importtree=yes` when set up with [[git-annex-initremote]](1). Only some
kinds of special remotes will let you configure them this way. kinds of special remotes will let you configure them this way.
@ -39,7 +43,13 @@ For example:
git annex import master --from myremote git annex import master --from myremote
git merge myremote/master git merge myremote/master
It's also posible to limit the import to a subdirectory, using the Note that you may need to pass `--allow-unrelated-histories` the first time
you `git merge` from an import. Think of this as the remote being a
separate git repository with its own files. If you first
`git annex export` files to a remote, and then `git annex import` from it,
you won't need that option.
You can also limit the import to a subdirectory, using the
"branch:subdir" syntax. For example, if "camera" is a special remote "branch:subdir" syntax. For example, if "camera" is a special remote
that accesses a camera, and you want to import those into the photos that accesses a camera, and you want to import those into the photos
directory, rather than to the root of your repository: directory, rather than to the root of your repository:
@ -47,10 +57,6 @@ directory, rather than to the root of your repository:
git annex import master:photos --from camera git annex import master:photos --from camera
git merge camera/master git merge camera/master
You can combine using `git annex import` to fetch changes from a special
remote with `git annex export` to send your local changes to the special
remote.
The `git annex sync --content` command (and the git-annex assistant) The `git annex sync --content` command (and the git-annex assistant)
can also be used to import from a special remote. can also be used to import from a special remote.
To do this, you need to configure "remote.<name>.annex-tracking-branch" To do this, you need to configure "remote.<name>.annex-tracking-branch"

View file

@ -21,24 +21,6 @@ this.
* export needs to use storeExportWithContentIdentifierM for importtree=yes * export needs to use storeExportWithContentIdentifierM for importtree=yes
remotes remotes
* Merging the first import from a remote currently removes all local
files that are not present in the remote. But subsequent imports from the
remote do not delete newly added local files when merged. This seems
inconsistent and very surprising to the user.
It happens because the remote tracking branch currently starts
from the local branch, and then has a commit added to it that contains
all files in the remote (and thus deletes the local files).
A subsequent import extents the tracking branch by another commit, so
merging that does not re-do the deletion.
One fix would be to start the remote tracking branch not with the local
branch. Reflecting it being a perhaps entirely separate line of
development. Unless git-annex export were used first, and updated the
tracking branch, then the branch would start with what's exported, which
is fine. The downside of this is that git merge --allow-unrelated-histories
is needed to merge that unrelated history.
* export needs to update the tracking branch with what it exported * export needs to update the tracking branch with what it exported
* "git annex import master --from rmt" followed by "git annex import master:sub --from rmt" * "git annex import master --from rmt" followed by "git annex import master:sub --from rmt"