【问题标题】:Why are these subtree assertions failing?为什么这些子树断言失败?
【发布时间】:2019-01-19 22:25:43
【问题描述】:

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

【问题讨论】:

  • 这和微软的命令处理器有什么关系。
  • 你想完成什么?你认为 subtree split 命令会做什么?
  • @CatCat 可能是一个错误标签,因为 OP 可能正在使用 CMD 运行命令。
  • @CatCat 我的错,我不知道我添加那个标签时在想什么
  • @evolutionxbox 不是将目录的历史记录从主存储库中拆分到自己的存储库中吗?

标签: git assertion git-subtree


【解决方案1】:

看来,@nethergranite 想通了。 Git 的 git-subtree 可能无法跟踪 git-subtree --split 的单个文件,至少在某些当前版本中是这样。

当我试图从 GNU Emacs 'lisp/obsolete' 目录中恢复一些已删除的代码时,我在 git-subtree 中发现了一个类似的错误——即一个 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 存储库,然后可以独立于原始源树进行管理...许可证/链接/redist 规定允许。更多文档可能在 git-subtree(1) 手册页中可用。

除此之外,似乎 git-subtree 可能只需要一个目录前缀,而不是单个文件作为前缀——等待对其源代码的任何修订,如果 git-subtree 理论上可以从一个单个文件前缀,就 git 如何在 Git 存储库中管理其内部状态而言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多