首页 > 解决方案 > 为什么暂存命令 git read-tree不管用

问题描述

在 O'reilly 的 Bogdan Stashchuk 的课程“完整的 Git 指南:理解和掌握 Git 和 GitHub”中。在第 3 章使用 git ls-files 读取暂存区中的文件。

我正在使用 git read-tree 命令将文件放入暂存区。但是我收到错误消息“错误:无效路径“file1.txt””。这个特定的树包含两个 blob 对象。

$ find .git/objects -type f
.git/objects/13/30b1315f618bbb92980a72304d102077a06456
.git/objects/37/0d3a4362e43ff0b8b8b44dc571a4943c2ae849
.git/objects/55/7db03de997c86a4a028e1ebd3a1ceb225be238
.git/objects/9d/85f911b64dff32d66d462086e8b13207efa4c5
.git/objects/dd/1d744af6af14449fbc727490e2b90439b27ad6
.git/objects/fe/65c715aff73bceac655b9032a26658404cdcfe

  $ git cat-file -t 1330
tree 
     
$ git read-tree 1330
error: invalid path 'file1.txt
100644 blob 9d85f911b64dff32d66d462086e8b13207efa4c5    file2.txt



'

我在桌面上创建了一个文本文件,然后使用命令 (cd nano temp-tree.txt) 我编辑了文件的内容 (100644 blob file1.txt),同样我只在该文件中编写了第二个 blob 对象。之后我进入我的 git repo 并输入命令(cat ../temp-tree.txt | git mktree -z)。然后创建了文件,我可以在隐藏文件夹中看到它。此外,所有 cat 命令都在处理这个问题。

此外,当我创建新的 git repo 、 blob object 、 tree 对象并尝试再次使用 git-read tree 命令时,没有输出。请帮忙。谢谢

标签: gitgithubgitlabgitlab-ci

解决方案


  • 检查该树对象的内容:

    git cat-file -p 1330
    
  • 检查什么git fsck和 gitfsck --unreachable


从错误消息中:看起来 git 将两个单引号之间的所有内容(例如:从 3 个空行开始file1.txt...和以 3 个空行结束的五行)解释为单个路径。

我的猜测是该树对象的原始内容中有一些可疑之处。


使用该-z选项,mktree期望\0字符(而不是\n)来分隔输入中的值。它旨在与输出字符的命令结合使用\0,例如git ls-files -z.

由于您手动编辑了输入,因此您没有\0在文件中插入字符,因此mktree将第一个哈希之后的所有内容作为单个“路径”(显然,没有对其进行检查以确认它看起来像有效路径)。

如果您真的打算使用git mktree手动输入:删除-z, 并阅读错误消息以尝试了解不适合的内容。

(我猜:从你的文件中删除空行,如果你的操作系统是 Windows,把你的行结尾变成“linux 风格”)


除非您试图明确了解如何使用git mktree,否则最好使用常规创建树:

git add file1.txt file2.txt
# will create a tree and a commit :
git commit

# to get the hash of the tree :
git rev-parse HEAD^{tree}     
# or
git cat-file -p HEAD  # look for the 'tree <sha1>' line

或者可能:

git add file1.txt file2.txt
# will create only a tree, from the index :
git write-tree

请参阅git help write-treegit help mktree以获得一些指示,以及git book以获得有关对象如何存储在 git 中的良好指导。


推荐阅读