排查并解决同步问题

本页介绍如何排查和修复与repo sync命令相关的问题。

修复网络问题

本部分提供了一些修复可能导致同步失败的网络问题的建议。

使用身份验证以避免配额障碍

为了防止服务器过度使用,用于访问源的每个 IP 地址都与配额相关联。

与其他用户共享 IP 地址时,例如从 NAT 防火墙之外访问源存储库时,可能会触发正常模式的配额。例如,当多个用户在短时间内从同一 IP 地址同步新客户端时,就会触发配额。

为了避免触发配额,您可以使用经过身份验证的访问,该访问对每个用户使用单独的配额,无论 IP 地址如何。

要启用经过身份验证的访问:

  1. 使用密码生成器创建密码。

  2. 运行以下命令将客户端转换为使用自动身份验证(无需更改分支):

    $ repo init -u https://android.googlesource.com/a/platform/manifest
    

    请注意, /a/目录前缀会触发自动身份验证。

配置代理使用

如果您从代理后面下载源代码(这在某些企业环境中很常见),请确保通过运行以下命令显式指定要供 Repo 使用的代理:

$ export HTTP_PROXY=http://proxy_user_id:proxy_password@proxy_server:proxy_port
$ export HTTPS_PROXY=http://proxy_user_id:proxy_password@proxy_server:proxy_port

调整 TCP/IP 设置以避免连接问题

虽然这种情况很少见,但 Linux 客户端可能会遇到连接问题,例如在接收对象时陷入下载过程。要改善此问题,请调整 TCP/IP 堆栈的设置或使用非并行连接。您必须具有 root 访问权限才能修改 TCP 设置。要修改设置,请发出以下命令:

$ sudo sysctl -w net.ipv4.tcp_window_scaling=0
$ repo sync -j1

使用本地镜像避免网络延迟

使用多个客户端时,您可以创建整个服务器内容的本地镜像,并从该镜像同步客户端,而无需访问网络。按照以下说明在~/aosp-mirror/中创建本地镜像并根据该镜像同步客户端:

  1. 创建并同步镜像:

    $ mkdir -p /usr/local/aosp/mirror
    $ cd /usr/local/aosp/mirror
    $ repo init -u https://android.googlesource.com/mirror/manifest --mirror
    

    这些命令在/user/local/aosp/mirror中创建本地镜像,并使用--mirror标志和repo init命令来初始化镜像。

  2. 要从镜像同步客户端:

    $ mkdir -p /usr/local/aosp/main
    $ cd /usr/local/aosp/main
    $ repo init -u /usr/local/aosp/mirror/platform/manifest.git
    $ repo sync
    
  3. 最后,按照以下命令将镜像与服务器同步,并将客户端与镜像同步:

    $ cd /usr/local/aosp/mirror</code>
    $ repo sync
    $ cd /usr/local/aosp/main
    $ repo sync
    

可以将镜像存储在 LAN 服务器上并通过 NFS、SSH 或 Git 访问它。还可以将其存储在可移动驱动器上,并在用户或计算机之间传递该驱动器。

使用部分克隆

如果您使用的是 Git 版本 2.19 或更高版本,请在执行repo init时指定--partial-clone以克服任何低延迟网络问题:

  $ repo init -u https://android.googlesource.com/platform/manifest -b main --partial-clone --clone-filter=blob:limit=10M

此命令不是初始化 Repo 来下载所有内容,而是根据需要下载 Git 对象。

修复特定同步问题

本页详细介绍了您在尝试同步 Android 源代码时可能遇到的一些已知问题。

命令失败并出现 403 或 500 错误(代理问题)

repo initrepo sync命令可能会失败并出现 403 或 500 错误。大多数情况下,这些错误与 HTTP 代理难以处理大量数据传输有关。

虽然这些错误没有具体的修复方法,但使用最新的 Python 版本并显式使用repo sync -j1有时会有所帮助。