-1

我创建了一个镜像仓库工作区,如下所示:

repo init -u $url -b $branch  -m $manifest --mirror
repo sync

我想更新镜像以使用不同的清单或更新的清单,然后重新同步以拉下任何新的或丢失的更改。如果我尝试运行相同的 init 命令,它会抱怨:

fatal: --mirror is only supported when initializing a new workspace.
Either delete the .repo folder in this workspace, or initialize in another location.

我想我可以手动获取.repo/manifests,然后更新符号链接,.repo/manifest.xml. 不过,如果可能的话,我想改用 repo 工具。

或者我可以删除整个.repo目录,然后再次运行 init 命令。我正在避免这种情况,因为不幸的是我的清单文件位于 12GB 存储库中。因此,重新克隆非常耗时。

4

1 回答 1

0

我最终放弃了这个想法。相反,我在本地创建了一个包含清单的一次性 git 存储库。然后我从那里开始。下面的 shell 函数将创建临时清单存储库,创建/更新镜像,然后创建一个用于构建的工作存储库。

功能参数

  • 镜子

    • /路径/到/镜像
  • 网址

    • /path/to/temporary/manifests_repo
  • 分支

    • 要使用的分支名称。
      这不是绝对必要的,但它可以很容易地标记您的构建目录。我使用与当前 manifest.xml 对应的主存储库中的哈希。然后,我可以很容易地看到构建目录基于哪个版本: $ repo info Manifest ... Manifest merge branch: refs/heads/BRANCH_NAME
  • 显现

    • 当前目录中的 relative/path/to/manifest_file
  • build_dir

    • /path/to/new_build_directory

创建镜像的原因是为了节省获取时间,因为此代码是为自动构建服务器设计的。请注意,构建目录从镜像中进行了浅层克隆,甚至从允许离线构建的本地包中获取了 Google 的 repo 工具的副本。同步步骤使用选项仅获取清单所需的变更集,并排除其他分支和提交。

function pushd_quiet() {
    pushd "$@" >/dev/null
}

function popd_quiet() {
    popd "$@" >/dev/null
}

function build_android_os_update_mirror() {
    local mirror="$1"
    local url="$2"
    local branch="$3"
    local manifest="$4"

    # Create a temporary manifest repo
    rm -rf "${url}"
    mkdir -p "${url}"
    cp -rf "${manifest}" "${url}"
    pushd_quiet "${url}"
    {
        git init
        git add .
        git commit -m $branch
        git branch -m $branch
        popd_quiet
    }

    # Update mirror
    mkdir -p $mirror
    pushd_quiet $mirror
    {
        rm -rf .repo
        repo init -u $url -b $branch -m $(basename $manifest) --mirror \
             --repo-url ${BUILD_HOME}/tools/git-repo-clone.bundle
        repo sync -c --optimized-fetch -j 16
        popd_quiet
    }
}

function build_android_os_create_build_tree() {
    local build_dir="$1"
    local mirror="$2"
    local url="$3"
    local branch="$4"
    local manifest="$5"

    rm -rf $build_dir
    mkdir -p $build_dir
    pushd_quiet $build_dir
    {
        repo init -u $url -b $branch -m $(basename $manifest) --reference=$mirror --depth=1 \
             --repo-url ${BUILD_HOME}/tools/git-repo-clone.bundle
        repo sync -d -c --optimized-fetch -j 16
        popd_quiet
    }
}
于 2015-10-21T14:13:13.207 回答