排查並修復同步問題

本頁介紹如何排查和修復與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有時會有所幫助。