如何更新镜像repo工作区?

时间:2015-10-16 17:13:23

标签: android git repo

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

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存储库中。因此,重新克隆是非常耗时的。

1 个答案:

答案 0 :(得分:0)

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

功能参数

    • /路径/到/镜
  • URL

    • /路径/到/临时/ manifests_repo
  • 分支

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

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

    • /路径/到/ 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
    }
}