[О блоге] [наверх] [пред] [2023-06-13 11:08:46+03:00] [6e86425441b195a915048fc71a4a50898e73a54e]
Темы: [git][tip]

Зеркалирование AUR зеркала

https://github.com/archlinux/aur
Есть Git-репозиторий со всеми AUR пакетами. Каждый находится в своей
ветке, а это почти 115k штук. Просто так сделать git clone не выходит
из-за этого. Но можно доставать все эти данные частями, просто получив
список веток, а дальше по тысяче (например) штук их запрашивать:

    git ls-remote https://github.com/archlinux/aur.git |
    cut -f2 | sed -n "s/^refs.heads.//p" |
    xargs -L1000 | while read pkgs ; do
        for pkg in $pkgs ; do echo ${pkg}:${pkg} ; done | git fetch --stdin origin
    done

А ещё стоит сделать "git config gc.auto 0", так как Git упорно запускает
gc при всём этом, сильно тормозя весь процесс. gc можно вызвать руками потом.

    [оставить комментарий]
    комментарий 0:
    From: kmeaw
    Date: 2023-06-15 22:48:38Z
    
    А почему не делалось зеркалирование из первоисточника в исходном
    формате? Кажется, тогда не было бы проблемы с выкачиваниеем огромного
    репозитория, а скачивание по частям получилось бы естественным образом.
    
    Примерно так (сам не провеерял, пишу по памяти):
    
    curl https://aur.archlinux.org/packages.gz | zcat |
    xargs -I{} -P10 git clone https://aur.archlinux.org/{}.git
    
    А ещё у aur.archlinux.org есть IPv6 (в отличие от github.com).
    
    комментарий 1:
    From: Sergey Matveev
    Date: 2023-06-15 23:19:47Z
    
    *** kmeaw [2023-06-15 23:45]:
    >А почему не делалось зеркалирование из первоисточника в исходном формате?
    >curl https://aur.archlinux.org/packages.gz | zcat |
    
    Потому что я нисколько не пользователь Arch-а и не в курсе как там у них
    чего устроено и совершенно не хочется разбираться (не интересен этот
    дистрибутив). Но знания о пакетах, где они (URL) и контрольные суммы
    могут рано или поздно где-нибудь да пригодится, а также возможно
    какие-то патчи. Зеркало AUR я просто мельком где-то увидел и решил вот
    склонировать. Но да, предложенный вариант явно получше, спасибо!
    
    комментарий 2:
    From: Sergey Matveev
    Date: 2023-06-16 08:21:11Z
    
    *** kmeaw [2023-06-15 23:45]:
    >А почему не делалось зеркалирование из первоисточника в исходном формате?
    
    Первоисточник через несколько десятков запросов выдаёт 429 HTTP код.
    Вставил sleep 1 между git запросами -- тоже быстро отлупливает меня.
    И это происходит не только на clone, но и на fetch.
    
    комментарий 3:
    From: kmeaw
    Date: 2023-06-17 08:23:35Z
    
    Фрагмент из /etc/nginx/nginx.d/aurweb.conf:
    
    # limit Git requests to block Git DoS attempts.
    # # grep aurwebgitlimit /var/log/nginx/aur.archlinux.org/error.log | awk '{ print $14 }' | sort | uniq | sort
    limit_req_zone $binary_remote_addr zone=aurwebgitlimit:10m rate=30r/m;
    limit_req_status 429;
    
    server {
        …
        location ~ "^/([a-z0-9][a-z0-9.+_-]*?)(\.git)?/(git-(receive|upload)-pack|HEAD|info/refs|objects/(info/(http-)?alternates|packs)|[0-9a-f]{2}/[0-9a-f]{38}|pack/pack-[0-9a-f]{40}\.(pack|idx))$" {
        limit_req zone=aurwebgitlimit burst=300 nodelay;
            …
            uwsgi_pass   smartgit;
            …
        }
    }
    
    Похоже, что git fetch делает много запросов, даже если с другой стороны
    отвечают по smart protocol.
    
    Если история не нужна, могу предложить ещё забирать snapshot, для них
    (location ~ ^/cgit) настроен limit_req zone=aurwebgitlimit burst=900
    nodelay:
    
    https://aur.archlinux.org/cgit/aur.git/snapshot/clickhouse.tar.gz
    
    Или можно попробовать скачать по SSH (что, правда, потребует регистрации
    для загрузки публичного ключа):
    
    git clone aur@aur.archlinux.org:clickhouse
    
    комментарий 4:
    From: Sergey Matveev
    Date: 2023-06-17 08:45:21Z
    
    *** kmeaw [2023-06-17 09:20]:
    >Похоже, что git fetch делает много запросов
    
    А я ведь его даже через tofuproxy пускал, чтобы тут keep-alive TLS
    соединение удерживал. Правда это усугублялось запуском под parallel,
    который восемь процессов плодил.
    
    >[...]могу предложить[...]
    
    Спасибо большое! Но мне это прям вообще не горит, не критично всё и это
    скорее просто проходя мимо я решил сделать копию на всякий пожарный,
    авось пригодится.