致命:git mktree 命令的输入格式错误

Fatal: input format error for git mktree command

我正在学习 GIT 在 Windows 10 上使用 GIT Bash。我正在学习创建一个 GIT 树对象。因此,我所做的是将以下哈希值制成两个 blob:

4400aae52a27341314f423095846b1f215a7cf08
b7aec520dec0a7516c18eb4c68b64ae1eb9b5a5e

两个 blob 都有权限 100644。现在我在桌面上创建了一个文件作为 temp-tree.txt 并添加了以下 blob 及其各自的参数:

100644 blob b7aec520dec0a7516c18eb4c68b64ae1eb9b5a5e file1.txt
100644 blob 4400aae52a27341314f423095846b1f215a7cf08 file2.txt

将其保存为临时 tree.txt。现在,在 master 文件夹的 GIT Bash 终端中,我给出了以下命令:

cat ../temp-tree.txt | git mktree

显示为:

fatal: input format error: 100644 blob b7aec520dec0a7516c18eb4c68b64ae1eb9b5a5e file1.txt

请向我建议如何更正它。我使用了 Udemy 的 Bodgan's Complete Git 和 GitHub 指南课程。 如果你愿意,我可以给你那部分的截图。但是,我现在不添加它,因为它可能不适用于某些渲染。感谢您的时间和精力。

更新 1:我尝试使用 TAB。但是,它给出了这个作为输出:

cat ../temp-tree.txt
100644 blob b7aec520dec0a7516c18eb4c68b64ae1eb9b5a5e    file1.txt
100644 blob 4400aae52a27341314f423095846b1f215a7cf08    file2.txt

cat ../temp-tree.txt | git mktree
fatal: input format error: (blank line only valid in batch mode)

tl;dr:在哈希值和文件名之间使用制表符,并确保文件具有 Unix 风格 (\n) 行尾。

git mktree 的手册页表明它:

Reads standard input in non-recursive ls-tree output format

git ls-tree的手册页表明这种格式是:

<mode> SP <type> SP <object> TAB <file>

您的文件看起来在 <object><file> 之间有一个 SP (space),而不是 TAB.


您还说您“创建了文件”但没有提供更多详细信息。如果您使用记事本创建它,那么该文件几乎肯定具有 DOS 样式 (\r\n) 行尾。 git 不会容忍的。

您需要使用 dos2unix(包含在 Git for Windows 中)或文本编辑器(在 vim,你会 :set ff=unix 然后保存文件并退出 :wq).

我也面临同样的问题,我所做的是在名为 file1.txtfile2.txt 的工作目录中创建两个文件,提交到暂存区并 git 创建树对象我正在使用这些文件。

生成哈希后,我删除了工作目录中的文件并使用 git read-tree 将文件从 git 存储库移动到暂存区,并使用命令 git checkout-index -a 移动文件从暂存区到工作目录。

为什么我要接近这个解决方案,这里的议程是在 git 存储库中创建树对象并将文件从 git 存储库移动到暂存和工作目录,如果我们面临创建问题树对象,然后允许 git 为我们创建对象,并应用我们在 git.

上学到的东西

希望我的回答能解答您的问题

我通过输入创建了一棵树:cat ../temp-tree.txt | git mktree -z。有效!我意识到输出是一个 2 数字的“文件”,而不是一个字符和一个数字,反之亦然。

BLOBS 的标准方法是:6b,c7 ??我猜不是。

使用 -z 标志后,树对象将以数字开头:56 或 42。

树肯定在那里。但是,当您输入 git read-tree + 哈希值 56a7(例如)时,它会抛出错误。我想我向前迈了 1 步。棘手的部分仍在集结区?

希望我的回答能继续解决这个问题!

使用我的 vs 代码编辑器编辑文件时遇到同样的问题:

观察命令的输出

od -bc <filename>

,制表符被 4 个空格替换,这导致了当使用记事本或记事本 ++ 编辑文件时,制表符被 \t 替换并且它起作用了。

像这样尝试它有效。

第 1 步:

echo "100644 blob b7aec520dec0a7516c18eb4c68b64ae1eb9b5a5e file1.txt" > temp-tree.txt

第 2 步:

echo "100644 blob 4400aae52a27341314f423095846b1f215a7cf08 file2.txt" >> temp-tree.txt

第 3 步:

cat ../temp-tree.txt | git mktree

删除内容顶部的 space。 您输入的信息的顶部和底部不应有 space。