问题排查和修复同步问题

本页面介绍了如何排查和修复与 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 有时可能会有所帮助。