致命:git mktree 命令的输入格式错误
Posted
技术标签:
【中文标题】致命:git mktree 命令的输入格式错误【英文标题】:Fatal: input format error for git mktree command 【发布时间】:2021-03-28 01:56:17 【问题描述】:我正在 Windows 10 上使用 GIT Bash 学习 GIT。我正在学习创建一个 GIT 树对象。所以,我所做的就是用以下哈希制作两个 blob:
4400aae52a27341314f423095846b1f215a7cf08
b7aec520dec0a7516c18eb4c68b64ae1eb9b5a5e
两个 blob 的权限为 100644。现在我在桌面上创建了一个文件 temp-tree.txt 并添加了以下 blob 及其各自的参数:
100644 blob b7aec520dec0a7516c18eb4c68b64ae1eb9b5a5e file1.txt
100644 blob 4400aae52a27341314f423095846b1f215a7cf08 file2.txt
将其保存为 temp-tree.txt。现在,在主文件夹的 GIT Bash 终端中,我给出了以下命令:
cat ../temp-tree.txt | git mktree
显示为:
fatal: input format error: 100644 blob b7aec520dec0a7516c18eb4c68b64ae1eb9b5a5e file1.txt
请向我建议如何纠正它。我使用了 Udemy 的 Bodgan 的完整 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)
【问题讨论】:
【参考方案1】:tl;dr:在哈希和文件名之间使用制表符,并确保文件具有 Unix 样式 (\n
) 行结尾。
git mktree
的手册页表明它:
以非递归 ls-tree 输出格式读取标准输入
而git ls-tree
的手册页表明这种格式是:
<mode> SP <type> SP <object> TAB <file>
您的文件看起来在<object>
和<file>
之间有一个SP
(空格),而不是TAB
。
您还说您“创建了文件”,但没有提供其他详细信息。如果您使用记事本创建它,那么该文件几乎可以肯定具有 DOS 样式 (\r\n
) 行结尾。 git 不会容忍这种情况。
您需要使用dos2unix
(包含在Windows 的Git 中)或文本编辑器(在vim 中为:set ff=unix
)之类的工具将此文件转换为具有Unix 样式的行尾,然后保存文件并退出:wq
)。
【讨论】:
好的。我再次尝试使用 TAB。 我试过了,但它给出了:fatal: input format error: (blank line only valid in batch mode)
这是猫输出:cat ../temp-tree.txt 100644 blob b7aec520dec0a7516c18eb4c68b64ae1eb9b5a5e file1.txt 100644 blob 4400aae52a27341314f423095846b1f215a7cf08 file2.txt
等等,当你说你创建了文件,你是怎么做到的?重要的是:这个文件有什么样的行尾?
我使用 nano 创建了下一行(进入下一行)【参考方案2】:
删除内容顶部的空格。 输入信息的顶部和底部不应有空格。
【讨论】:
【参考方案3】:我也面临同样的问题,我所做的是在名为 file1.txt
和 file2.txt
的工作目录中创建两个文件,提交到暂存区,然后 git 使用这些文件为我创建了树对象。
生成哈希后,我删除了工作目录中的文件并使用git read-tree
将文件从git存储库移动到暂存区,并使用命令git checkout-index -a
将文件从暂存区移动到工作目录。
为什么我要解决这个问题,这里的议程是在 git repo 中创建树对象并将文件从 git repo 移动到暂存和工作目录,如果我们在创建树对象时遇到问题,那么允许 git 为我们,并应用我们在 git 上学到的东西。
希望我的回答回答了你的问题
【讨论】:
【参考方案4】:我通过输入以下内容创建了一棵树: cat ../temp-tree.txt | git mktree -z。有效!我意识到输出是一个 2 数字“文件”而不是一个字符和一个数字,反之亦然。
BLOBS 的标准方法是:6b,c7 ??我猜不是。
使用 -z 标志后,树对象将以数字开头:56 或 42。
那棵树肯定在那里。但是,当您输入 git read-tree + 56a7 的哈希(例如)时,它会引发错误。我想我前进了 1 步。棘手的部分还在暂存区?
希望我的回答能继续解决这个问题!
【讨论】:
【参考方案5】:使用我的 vs 代码编辑器编辑文件时遇到同样的问题:
观察命令的输出
od -bc <filename>
,制表符被 4 个空格替换,这导致了当使用记事本或记事本++ 编辑文件时,制表符被替换为 \t 并且可以正常工作的问题。
【讨论】:
【参考方案6】:这样试试吧。
第 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
【讨论】:
正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。以上是关于致命:git mktree 命令的输入格式错误的主要内容,如果未能解决你的问题,请参考以下文章
致命:参考的格式无效:'refs/stash 2' (128)
致命错误:不兼容的文件格式:编码文件的格式主要 ID 为 7,而加载程序预计为 5 in
以 Clover XML 格式生成代码覆盖率报告...致命错误:无法重新声明 preprocessGrammar()