Git извлекает запросы на извлечение только после заданного

Как 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


2
73
2

Ответы:

Решено

Есть ли способ сказать «получить все PR, начиная с 1507 года»? Или какие-то другие критерии отбора пиара, например время?

Я не думаю, что существует собственный способ, а это значит, что вам нужно написать его.
И команды gh pr должны быть полезны как для:


Простой способ резко сократить размер клонирования/выборки в подобных случаях:

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

с любыми необходимыми кавычками, если у вас есть пробелы на ваших собственных путях.