1

我在不支持符号链接的文件系统上有一个git和项目。git annex因此,我必须使用调整后的分支,这意味着在我的“正常”分支之上执行git annex adjust --unlock,以便获得一个新分支,在该分支上,我的附件文件不是指向附件存储的符号链接,而是原始文件. 我的提交树看起来像这样:

  *  git-annex adjusted branch (HEAD, adjusted/master(unlocked))
* ┘ some change (master, refs/basis/adjusted/master(unlocked))
* some prior change
...

当我现在提交时,我猜我会在调整后的分支上这样做,因为 git-annex 无法使用git annex add MYFILE和 git commit` 创建符号链接:

  * my new commit (HEAD, adjusted/master(unlocked))
  *  git-annex adjusted branch 
* ┘ some change (master, refs/basis/adjusted/master(unlocked))
* some prior change

我想要的是对标准 git-annex 格式的 master 分支的提交,这意味着附件文件是指向它们在附件存储中的位置的符号链接。最后,因为我不能在我的文件系统中签出符号链接,我需要自动创建一个新的调整分支,用实际文件替换提交中的符号链接。

那么我如何从上述情况得到以下情况:

  *  git-annex adjusted branch (HEAD, adjusted/master(unlocked))
* ┘ my new commit (master, refs/basis/adjusted/master(unlocked))
│ *  git-annex adjusted branch (abandoned previous HEAD)
* ┘ some change
* some prior change

git附件调整上的git附件手册只告诉我如何获得调整后的分支,而不告诉我如何扭转调整。调整概念页面对我来说有点神秘(突出显示的文本)。

用户在调整后的分支上的提交必须进行反向调整才能将更改应用于主分支。

这种调整的逆转可以作为另一种调整来完成。由于只有被提交触及的文件会被反向调整,所以不需要反向所有由原始调整所做的更改。[当我的文件系统不支持它们时,我应该如何从文件反向调整到符号链接?]

例如,反转解锁调整可能会锁定文件。或者,它可能什么都不做,这会使所有提交的文件保持解锁状态。[ “可能什么都不做”是什么意思?条件是什么?]

4

1 回答 1

0

datalad 项目编写了函数datalad.support.AnnexRepo.localsync()来完成此操作。该功能的核心是

def localsync(self, remote=None, managed_only=False):
    """Consolidate the local git-annex branch and/or managed branches.
    This method calls `git annex sync` to perform purely local operations
    that:
    1. Update the corresponding branch of any managed branch.
    2. Synchronize the local 'git-annex' branch with respect to particular
       or all remotes (as currently reflected in the local state of their
       remote 'git-annex' branches).
    If a repository has git-annex's 'synced/...' branches these will be
    updated.  Otherwise, such branches that are created by `git annex sync`
    are removed again after the sync is complete.
    [...]
    """
    [...]
    cmd = ['sync']
    [...]
    cmd.extend([
        # disable any external interaction and other magic
        '--no-push', '--no-pull', '--no-commit', '--no-resolvemerge',
        '--no-content'])
    self.call_annex(cmd)
    # a sync can establish new config (e.g. annex-uuid for a remote)
    self.config.reload()
    # cleanup sync'ed branch if we caused it
    if not had_synced_branch and synced_branch in self.get_branches():
        lgr.debug('Remove previously non-existent %s branch after sync',
                  synced_branch)
        self.call_git(
            ['branch', '-d', synced_branch],
        )

所以所需的命令似乎是git annex sync --no-push --no-pull --no-commit --no-resolvemerge --no-content. 这可能会生成名称以“synced/...”开头的特殊 git 附件分支,这些分支也可能在之前的同步操作中已经存在。因此,如果它们事先不存在,则此功能会删除它们。

于 2021-12-16T07:05:11.140 回答