为什么这些子树断言失败?

时间:2018-08-13 08:27:28

标签: git assertion git-subtree

我正在尝试使用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

1 个答案:

答案 0 :(得分:0)

似乎,@ nethergranite知道了。至少在某些当前版本中,Git的git-subtree可能无法跟踪git-subtree --split的单个文件。

当尝试从GNU Emacs的'lisp / obsolete'目录(即一个scribe.el)中恢复一些已删除的代码时,我在git-subtree中发现了类似的错误。当我运行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)的前缀

出于管理目的,可以使用例如

  

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存储库,然后可以从该树中独立于原始源树进行管理……许可证/链接/ redist规定允许。进一步的文档可以在git-subtree(1)手册页中找到。

除此之外,似乎git-subtree可能只需要目录前缀,而不是单个文件作为前缀-如果git-subtree从理论上说可以从单个文件前缀,就git如何在Git存储库中管理其内部状态而言。