git fast-import не работает
Я просто пытаюсь удалить историю за конкретным коммитом. Я нашел в Git: как удалить историю перед конкретной фиксацией следующей командой:
git fast-export master~5..master | (cd ../newrepo.git && git init . && git fast-import && git checkout)
Я только что изменил команду для своего случая (мне нужны последние 65 коммитов ветки ip6_dev):
git fast-export ip6_dev~65..ip6_dev | (cd ../puppet/ && git init . && git fast-import && git checkout)
Когда я запускаю команду, я получаю следующий вывод:
---------------------------------------------------------------------
Alloc'd objects: 10000
Total objects: 7985 ( 782 duplicates )
blobs : 4978 ( 0 duplicates 2304 deltas of 49
25 attempts)
trees : 2942 ( 782 duplicates 263 deltas of 29
28 attempts)
commits: 65 ( 0 duplicates 0 deltas of
0 attempts)
tags : 0 ( 0 duplicates 0 deltas of
0 attempts)
Total branches: 1 ( 1 loads )
marks: 1048576 ( 5043 unique )
atoms: 2438
Memory total: 2997 KiB
pools: 2606 KiB
objects: 390 KiB
---------------------------------------------------------------------
pack_report: getpagesize() = 65536
pack_report: core.packedGitWindowSize = 33554432
pack_report: core.packedGitLimit = 268435456
pack_report: pack_used_ctr = 358
pack_report: pack_mmap_calls = 65
pack_report: pack_open_windows = 1 / 1
pack_report: pack_mapped = 14669749 / 14669749
---------------------------------------------------------------------
fatal: You are on a branch yet to be born
Что мне не хватает?
1 ответ
Самый последний шаг вашего && ...
последовательность:
git checkout
Обратите внимание на отсутствие имени ветви (или определенного идентификатора или пути фиксации). Тогда взгляните на git checkout
документация (которая, я признаю, делает это немного неясным):
Обновляет файлы в рабочем дереве в соответствии с версией в индексе или указанным деревом. Если пути не указаны, git checkout также обновится
HEAD
установить указанную ветку как текущую ветку. [...] Вы можете опустить, в этом случае команда вырождается, чтобы "проверить текущую ветку" ...
Следовательно, следующий вопрос, который нужно задать: "как называется текущая ветка?" Обычно можно бежать git branch
чтобы выяснить это, но если мы сделаем это, мы можем вообще ничего не получить (вы вообще ничего не получите, но вы также не получите ветку, отмеченную звездочкой; см. ниже):
$ mkdir example.git
$ cd example.git
$ git init
Initialized empty Git repository in ...
$ git branch
$
Есть альтернативная команда git более низкого уровня, которая дает нам правильный ответ:
$ git symbolic-ref --short HEAD
master
$
(или мы можем обмануть и посмотреть файл .git/HEAD
).
Обратите внимание, что я на самом деле не бегал git fast-import
на данный момент, но если я бегу git checkout
без аргументов я получаю ту же ошибку:
$ git checkout
fatal: You are on a branch yet to be born
Остается лишь указать на то, что git fast-import
импортирует коммиты (и ветки) в соответствии с указаниями, полученными из git fast-export
, который вы указали - по имени - экспортировать только определенные коммиты из ветки ip6_dev
, Следовательно, я могу предсказать, что если вы запустите git branch
вот увидишь:
$ git branch
ip_dev
$
Это означает, что ваш новый репо имеет только одну ветку, ip_dev
, который не является ветвью, на которой вы находитесь: вы находитесь на master
, которого еще не существует. Если бы ты fast-export
некоторые коммиты на ветке master
, master
будет существовать, и вы сможете сделать git checkout
,
Если вы хотите иметь только один ip_dev
ветвь, просто проверьте это явно, чтобы вы переключили текущую ветвь. У тебя еще не будет master
, но теперь git не будет жаловаться на то, что не может проверить это.