Почему я не могу собрать всех родителей?

Я пытаюсь создать пакет git только с частичной историей. Команда, которую я запускаю, чтобы связать всю ветку: ( ссылка)

git bundle create my.bundle --all

Однако, если я хочу только связать начальный коммит до (не включая) конкретного коммита, правильный синтаксис rev-parse будет. ( ссылка)

git bundle create my.bundle dae86e1950b1277e545cee180551750029cfe735^@

Но это терпит неудачу и мерзавец говорит...

fatal: Refusing to create empty bundle.

Как создать пакет только с исходной фиксацией и всей историей вплоть до некоторой конкретной ревизии?

РЕДАКТИРОВАТЬ

Я нашел этот пост, который объясняет, что git bundle работает только с тегом (или другой ссылкой, такой как HEAD). Однако я пытаюсь связать ряд коммитов, но .. Сокращение является эксклюзивным и не будет включать в себя начальный коммит.

1 ответ

Решение

Короткий ответ: вы не можете - ну, не совсем. По существу, git bundle серверная половина git fetch: он создает файл, который вы буквально передаете git fetch позже, когда вы перенесли этот файл с сервера на клиент. Клиенту требуется, чтобы этот файл содержал данные, которые сервер передал бы клиенту.

В результате файл комплекта должен содержать:

  • список имен ссылок и их хэш-идентификаторов, а также
  • объекты, которые git fetch будет основываться на этих хэш-идентификаторах, минус
  • объекты, которые git fetch не нужно будет основываться на хэш-идентификаторах клиента "у меня уже есть...".

При подготовке комплекта вы приводите следующие аргументы:

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

Нигде в этом списке вещей, которые вы предоставляете, нет возможности использовать rev^@ Стиль ссылок.

Что ты можешь сделать

Что вы можете сделать, так это прикрепить ссылочные имена к каждой из этих глав:

for parent in $(git rev-parse ${rev}^@); do
    git tag bundle-p$parent $parent
done

Теперь у вас есть реальные ссылочные имена (легкие теги), указывающие на каждый коммит, который вы хотите включить в пакет. Теперь вы можете поставить --tags='bundle-p*' как набор положительных ссылок, при условии, что нет других тегов, начинающихся с bundle-p, (Вы можете удалить теги позже, чтобы сохранить этот инвариант. Вместо этого вы можете использовать имена веток, с --branches='bundle-p*', если это более удобно для вас.)

(Быть в курсе, что ${rev}^@ не будет выводиться при применении к корневому коммиту. Это значит, что не будет bundle-p* теги для этого случая.)

Если ваша конкретная точка останова - обычный (с одним родителем) коммит, вы можете просто прикрепить одно ссылочное имя к ${rev}^, Во всех случаях вы должны прикрепить ссылочное имя к коммитам конечной точки, которые вы хотите иметь в комплекте.

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