Как получить достаточно коммитов, чтобы выполнить слияние в неглубоком клоне

Что я пытаюсь сделать: протестировать пул-реквесты с github. Я хочу локально объединить запрос на вытягивание с мастером и запустить несколько тестов на результат. Поскольку репозиторий огромен, я делаю неглубокий клон.

Чтобы иметь возможность выполнить слияние, я получаю все больше и больше коммитов (git fetch с увеличением --depth), пока не получу merge-commit между мастер-реквестом на вытягивание.

Однако это не работает каждый раз. Похоже, мне нужна не только база слияния, но и каждый коммит в диапазоне master..merge_base. Однако я не уверен, как это сделать.

Итак, вопрос: как получить достаточно истории для слияния?


person madjar    schedule 21.11.2014    source источник


Ответы (2)


Если у вас есть история, когда feature разветвлялась от master, но вам не нужна полная история master, вы можете оценить дату ветвления и использовать;

git fetch --shallow-since=<date> origin master

Трудно использовать любую другую форму git fetch, чтобы делать то, что вы хотите (запросить удаленный для базы слияния), потому что git fetch извлекает ссылки. Там может не быть реф, который вы ищете.

Вы можете автоматизировать копание, используя следующий скрипт.

while [ -z $( git merge-base master feature ) ]; do     
    git fetch -q --deepen=1 origin master feature;
done
person Adam    schedule 13.05.2019
comment
Выполнение такого большого количества выборок только на один уровень глубже кажется ужасно неэффективным из-за накладных расходов на сеть и git. Может быть, лучше использовать что-то вроде deepen=100. - person fabb; 13.05.2019
comment
@fabb полностью согласен. Настраивайте по желанию. - person Adam; 13.05.2019
comment
Вторая команда просто зацикливается, когда я пытаюсь ее использовать: git merge-base [-a | --all] ‹commit› ‹commit›... или: git merge-base [-a | --all] --octopus ‹commit›... или: git merge-base --independent ‹commit›... или: git merge-base --is-ancestor ‹commit› ‹commit› или: git merge- base --fork-point ‹ref› [‹commit›] -a, --all выводит всех общих предков --octopus находит предков для одного n-стороннего слияния --независимый список версий, недостижимый из других ‹больше, кроме ограничений на количество символов › ``` - person Zac Sweers; 26.07.2020
comment
Обратите внимание, что для --deepen требуется Git 2.11+ (начиная с 2016 г.). - person Nickolay; 13.12.2020
comment
git fetch --since, похоже, не работает надежно с объединенной историей Git. Кажется, что часто выбирается неправильная ветвь истории, и тогда у вас нет запрошенной фиксации. - person Pavel Šimerda; 04.02.2021

То, что вам нужно (я думаю), в стиле «уловки-22», это «git описать --all --first-parent», чтобы сообщить вам глубину данного коммита из соответствующей ветки. Однако я не уверен, как получить это от Github, прежде чем вы сделаете свою неглубокую выборку ;-)

person Philip Oakley    schedule 21.11.2014
comment
Даже в этом случае глубина коммита вычисляется с использованием кратчайшего пути от мастера к коммиту, но мне (кажется) нужна вся фиксация между мастером и merge_base, которая может быть глубже, чем merge_base. - person madjar; 21.11.2014
comment
Ах, да, я не подумал о полном обходе до базы слияния (а не о кратчайшем пути). Если у вас есть цикл слияния, в котором было много мелких коммитов, эта глубина может быть довольно большой. К сожалению, неглубокая выборка ограничена только подсчитанной глубиной, а не какой-либо другой схемой. И я до сих пор не уверен, как определить глубину в любом случае! - person Philip Oakley; 22.11.2014