Игнорировать одно пространство имен в git refspec

Рассмотрим следующий репозиторий. У него много частных веток для членов команды, все под refs/heads/team/ пространство имен, которое я не хочу получать, но я все еще хочу получить все остальное, включая любые, возможно, недавно созданные ветви вне этого team Пространство имен.

$ git ls-remote http://gerrit.asterisk.org/asterisk refs/heads/* | wc -l
217
$ git ls-remote http://gerrit.asterisk.org/asterisk refs/heads/* | grep -v refs/heads/team/ | wc -l
32

Я везу fetch = +refs/heads/*:refs/remotes/golden/*, но эти частные филиалы просто подавляют мою refs/remote/golden пространство имен, что усложняет обзор, а также требует больше места для локального хранилища.

Можно ли получить refs/heads/*но исключить refs/heads/team/*?

2 ответа

Решение

К сожалению нет.

К счастью, вы можете быть произвольно близко, особенно если вы хотите использовать двухпроходную выборку каждый раз, или выборку, сопровождаемую проходом удаления (возможно, это будет на самом деле более эффективным или, по крайней мере, эффективным по времени; это может занять немного больше места, в зависимости от того, сколько объектов окажется бесполезным).

По сути, идея состоит в том, чтобы перечислить все, что нужно сделать, сначала запустив git ls-remote а затем делать свою собственную фильтрацию и переписать fetch = запись (ну записи) для удаленного:

git ls-remote "$remote" 'refs/heads/*' |
    (git config --unset-all "remote.$remote.fetch";
     while read hash ref; do
        case $ref in refs/heads/team/*) continue;; esac
        rmtref="refs/remotes/$remote/${ref#refs/heads/}"
        git config --add "remote.$remote.fetch" "+$ref:$rmtref"
     done)
git fetch "$remote"

(добавить какую-нибудь внешнюю работу, чтобы установить $remote соответственно). Ключом к этой работе является то, что git объединяет, а затем подчиняется всем fetch = линий.

Для другой идеи, запустить нормальный (+refs/heads/*:refs/remotes/...) выборка с последующей серией git update-ref -d refs/remotes/$remote/${ref#refs/heads/} для ссылок, которые соответствуют нежелательной форме. Бросить в git gc (или же git repack и / или обрезать) потом, если хотите, чтобы уменьшить хранилище.

Дублировать: пропустите копирование некоторых веток/тегов в локальный Git с помощью git fetch --all

Это поддерживается начиная с Git 2.29:

Предполагая, что ваш пульт называется origin, вы сможете использоватьgit config --add remote.origin.fetch '^refs/heads/team/*'исключитьrefs/heads/team/префикс из выборок.

Другие вопросы по тегам