Почему эти утверждения поддерева терпят неудачу?

Я пытаюсь использовать git subtree, чтобы разделить мой репозиторий на несколько репозиториев, сохраняя при этом всю историю. В этом случае я пытаюсь разделить отдельные файлы из основного репозитория на отдельные репозитории, чтобы их можно было поддерживать как независимые проекты.

Я попытался запустить команду

git subtree split -P lib/a.lua -b temp

но получил следующий вывод:

assertion failed:  test blob = tree -o blob = commit
assertion failed:  test blob = tree -o blob = commit
assertion failed:  test blob = tree -o blob = commit
…

Что это значит? Что я делаю не так? Мой каталог выглядит так:

project
 ├ main.lua
 └ lib
    ├ a.lua
    └ b.lua

person NetherGranite    schedule 13.08.2018    source источник
comment
Какое это имеет отношение к командному процессору Microsoft.   -  person CatCat    schedule 13.08.2018
comment
Что вы пытаетесь достичь? Как вы думаете, что будет делать команда разделения поддерева?   -  person evolutionxbox    schedule 13.08.2018
comment
@CatCat, вероятно, неправильный тег, поскольку OP, вероятно, будет использовать CMD для запуска команд.   -  person evolutionxbox    schedule 13.08.2018
comment
@CatCat Плохо, я не знаю, о чем я думал, когда добавлял этот тег   -  person NetherGranite    schedule 13.08.2018
comment
@evolutionxbox Разве он не берет историю каталога и не выделяет ее из основного репозитория в свой собственный репозиторий?   -  person NetherGranite    schedule 13.08.2018
comment
Я честно не знаю без исследования. Я надеялся, что вы добавите к вопросу свои ожидания.   -  person evolutionxbox    schedule 13.08.2018
comment
@evolutionxbox О, понятно. Я могу это сделать.   -  person NetherGranite    schedule 13.08.2018


Ответы (1)


Кажется, @nethergranite разобрался. Git-subtree может не иметь возможности отслеживать отдельные файлы для git-subtree --split, по крайней мере, в некоторых существующих версиях.

Я обнаружил аналогичную ошибку из git-subtree при попытке восстановить некоторый удаленный код из каталога GNU Emacs 'lisp/obsolete', а именно один scribe.el. Когда я запустил git-subtree -P <file-pathname> [other-args], Git также начал выдавать сообщение assertion failed.

В качестве альтернативы, используя синтаксис, например

git subtree -b split_${changest_ID} --annotate="split lisp/obsolete:" -P lisp/obsolete/

... затем он работает нормально, используя относительный каталог в качестве префикса для git-subtree(1)

Для целей администратора changest_ID можно получить, например, с помощью

git log --pretty=short --abbrev-commit -n1 -- relpath/to/subdir/

... кроме того, синтаксический анализ ссылки фиксации (ID) с помощью текстовых инструментов, например

git log --pretty=short --abbrev-commit -n1 -- relpath/to/subdir/ | head -n1 | awk '{print $2}'

Производное имя ветки — split_${changest_ID} — затем можно использовать для отправки поддерева каталога в локальный голый репозиторий git, из которого затем можно будет управлять им независимо от исходного исходного дерева… условия лицензии/привязки/редистинга позволяет. Дополнительная документация может быть доступна на странице руководства git-subtree(1).

Помимо всего этого, кажется, что git-subtree может просто понадобиться префикс каталога, а не отдельный файл в качестве префикса - в ожидании каких-либо изменений исходного кода как такового, если git-subtree когда-либо теоретически может создать поддерево из одного префикса файла , поскольку git управляет своим внутренним состоянием в репозитории Git.

person Sean Champ    schedule 06.12.2018