致命: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.txt
和 file2.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。
我正在学习 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.txt
和 file2.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。