Почему я не могу собрать всех родителей?
Я пытаюсь создать пакет 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}^
, Во всех случаях вы должны прикрепить ссылочное имя к коммитам конечной точки, которые вы хотите иметь в комплекте.