Sau đây là hướng dẫn tạo một local mirror cho Android AOSP để lưu trữ và phát triển trên server nội bộ.

Mã nguồn script tạo mirror và đồng bộ mã nguồn từ một git repository. Script này là một utility để hỗ trợ cho script chính sau này.

[SERVER] /usr/local/bin/git-mirror.sh

#!/bin/bash
# git-mirror.sh <url> [TARGET]
# @author: Nguyen Hong Hai
#
git_url=$1
out_dir=$2
 
if [ -z ${git_url} ]; then
    echo "Usage: $(basename $0) <url> [TARGET]" >&2
    exit 1
fi
 
project_name=$(basename ${git_url} .git)
project_dir=${project_name}.git
 
if [ -n "${out_dir}" ]; then
    # create the sub directories if it does not exist.
    mkdir -p ${out_dir}
    cd ${out_dir} || exit 2
fi
 
# clone if the repo does not exist, otherwise just fetch it
if [ -d ${project_dir} ]; then
    echo "Fetching: ${git_url}"
    cd ${project_dir}
    git fetch && cd ..
else
    echo "Cloning: ${url}"
    git clone --mirror ${git_url} ${project_dir}
fi

Phân quyền executable cho script.

$ sudo chmod a+x /usr/local/bin/git-mirror.sh

Mã nguồn script tạo local mirror cho Android AOSP. Script này sẽ tải toàn bộ những repository xuất hiện trên Gitiles của Google (kể cả những repository không cần thiết cho việc phát triển).

[SERVER] /usr/local/bin/git-mirror-aosp.sh

#!/bin/bash
# git-mirror-aosp.sh - mirror all Android source code
# @author: Nguyen Hong Hai
#
aosp_base=https://android.googlesource.com
aosp_list=${aosp_base}/?format=TEXT
 
out_dir=/aosp
cur_list=${out_dir}/projects.list
new_list=${cur_list}.new
 
# create the target directory if it does not exist.
mkdir -p ${out_dir}
 
# download the project list, if failed then use the previous one
echo -n "Downloading the project list....."
wget -O ${new_list} ${aosp_list} &> /dev/null
if [ $? -ne 0 ]; then
    echo "[NG]"
    # reuse the old project list
    rm -f ${new_list}
else
    echo "[OK]"
    # update the project list
    mv -f ${new_list} ${cur_list}
fi
 
[ -f ${cur_list} ] && for project in $(cat ${cur_list}); do
    git-mirror.sh ${aosp_base}/${project} \
               ${out_dir}/$(dirname ${project})
done

Phân quyền executable cho script.

$ sudo chmod a+x /usr/local/bin/git-mirror-aosp.sh

Thêm task vào crontab để tự động download và đồng bộ mỗi 30 phút.

$ sudo crontab -e

*/30 * * * * /usr/local/bin/git-mirror-aosp.sh

Để checkout mã nguồn từ server nội bộ:

$ mkdir ~/bin
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

$ AOSP_SERVER=ssh://icreativ@192.168.1.2
$ mkdir aosp/; cd aosp/

$ repo init -u ${AOSP_SERVER}/aosp/platform/manifest.git  \
            --repo-url=${AOSP_SERVER}/aosp/tools/repo.git \
            -b <branch>
$ repo sync -j1

Update: Tải và đồng bộ dùng repo script

Bản thân script repo của Google cũng hỗ trợ tạo local mirror cho mã nguồn Android, tuy nhiên nó chỉ tải những thành phần thiết yếu chứ không phải toàn bộ mã nguồn như khi sử dụng script trên.

Ta viết lại mã nguồn cho script git-mirror-aosp.sh như sau:

[SERVER] /usr/local/bin/git-mirror-aosp.sh

#!/bin/bash
# git-mirror-aosp.sh - mirror all Android source code
# @author: Nguyen Hong Hai
#
aosp_base=https://android.googlesource.com
aosp_mirror=${aosp_base}/mirror/manifest.git
out_dir=/aosp
 
# create the target directory if it does not exist.
mkdir -p ${out_dir}
cd ${out_dir}
 
# initialize the AOSP repo if it was not.
[ -d .repo ] || repo init -u ${aosp_mirror} --mirror
 
# update the repositories
repo sync