排查并解决同步问题

本页介绍了如何排查和修复与 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 中创建本地镜像,并通过 repo init 命令使用 --mirror 标志初始化镜像。

  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 有时可能会有所帮助。