Как git fetch pull-запросы только после заданного PR?
Как специалист по сопровождению проекта, когда вы просматриваете запросы на включение из GitHub на предмет их возможного объединения, вы обычно добавляете следующую строку в свой файл .git/config
. Возможно есть и другие методы, я использую только этот.
[remote "origin"]
url = ....
fetch = +refs/heads/*:refs/remotes/origin/*
this => fetch = +refs/pull/*/head:refs/pull/origin/*
Каждую git fetch
(или git pull
) извлекаются все новые PR, и вы можете над ними работать.
Если вы работаете над новой рабочей областью git, первый git fetch
загружает все существующие PR с самого начала.
Есть одна ситуация, когда это проблема: мой репозиторий разросся из-за прошлых ошибок в двоичных файлах. Подкаталог .git
имел размер 2 ГБ, и любая операция git clone
занимала много времени. Эту историю переписали, зашили, ветки почистили и т.д. Теперь история .git
занимает всего 43 МБ. Все идет нормально. За исключением того, что когда вы добавляете строку fetch = +refs/pull/*/...
, она извлекает все прошлые PR, в том числе до перезаписи истории, которые основаны на старой толстой истории. Первый git fetch
занимает много времени, а подкаталог .git
снова занимает 2 ГБ. Всю старую жирную историю скачали только из-за старого пиара.
Предполагая, что нас больше не интересуют PR, предшествующие данному, как бы вы настроили свой локальный репозиторий, чтобы получать только более свежие PR, чем этот?
Выбранный PR можно получить с помощью следующей строки в .git/config
. Основываясь на текущей (переписанной) истории, он не раздувает репо больше, чем необходимо.
fetch = +refs/pull/1507/head:refs/pull/origin/1507
Однако нам нужно добавлять такие строки одну за другой для любого нового PR.
Есть ли способ сказать «получить все PR, начиная с 1507 года»? Или какие-то другие критерии отбора пиара, например время?
Основная идея состоит в том, чтобы избегать всех PR до определенной точки.
Уничтожение репозитория GitHub и его воссоздание — не вариант. Это проект с открытым исходным кодом, у которого слишком много истории, выпусков, проблем, обсуждений и т. д. Если вам интересно, это https://github.com/tsduck/tsduck
Есть ли способ сказать «получить все PR, начиная с 1507 года»? Или какие-то другие критерии отбора пиара, например время?
Я не думаю, что существует собственный способ, а это значит, что вам нужно написать его.
И команды gh pr должны быть полезны как для:
@ThierryLelegard Правда, просто помните о «Основном пределе скорости для аутентифицированных пользователей »: предпочтительнее проходить аутентификацию при выполнении вызовов gh
: это увеличивает этот лимит.
Простой способ резко сократить размер клонирования/выборки в подобных случаях:
git clone -n --filter=tree:0 $url $path
cd $path
git config --add remote.origin.fetch +refs/pull/*/head:refs/pull/origin/*
git fetch # to tee up the barest sketch of the pulls
git fetch --filter=blob:limit=32k
git checkout
начать с метаданных фиксации почти всего, но это будет приятно компактно, затем последняя выборка и сбрасывает фильтр, и проверка использует его.
Если вы хотите поиграть с локальным репо, вы можете настроить локальную фильтрацию, например.
git config uploadpack.allowfilters 1
git config uploadpack.allowanysha1inwant 1
git clone -n --filter=tree:0 file://$PWD `mktemp -d`; cd $_ # history-sketch no-checkout clone
git verify-pack -v .git/objects/pack/*.idx # show exactly what got fetched
git fetch --filter=blob:limit=32k
git verify-pack -v .git/objects/pack/*.idx # this gets just the tip tree, no checkout yet
git checkout
git verify-pack -v .git/objects/pack/*.idx # now you've added just the checked-out tree
с любыми необходимыми кавычками, если у вас есть пробелы на ваших собственных путях.
Спасибо, я всегда предпочитаю использовать простой git и забывать о gh. Кажется, это лучший способ выбрать PR-сообщения с GitHub.