git - 不使用暂存区创建树

标签 git

git internals git-scm 书的一章有一个如何创建 git 树的示例:

Git 通常通过获取暂存区域或索引的状态并从中写入一系列树对象来创建树。因此,要创建树对象,您首先必须通过暂存一些文件来设置索引。

然后他们列出了我可以用来创建树的命令。我的问题是我是否可以在不使用索引(暂存区)的情况下创建树?例如,不要这样做:

git update-index --add --cacheinfo 100644 83baae618... test.txt

使用这样的东西:

git create tree --add --cacheinfo 100644 83baae618... test.txt

更新基于 Ismail Badawi 的回答:

$ echo 'making tree' | git hash-object -w --stdin
07dae42a0730df1cd19b0ac693c6894a02ed6ad0

然后

$ echo -e '100644 blob 07dae42a0730df1cd19b0ac693c6894a02ed6ad0 \maketree.txt' | git mktree
fatal: input format error: 100644 blob 07dae42a0730df1cd19b0ac693c6894a02ed6ad0 \maketree.txt

最佳答案

您可以使用git mktree,如下所示:

echo -e "100644 blob 83baae618...\ttest.txt" | git mktree

(由于文字选项卡,您需要编写 echo -e。这是 shell 的东西,而不是 git 的东西)。

请注意,这会创建一个仅指向 83baae618 的树,因此它与您的 update-index 调用并不完全相同,后者会添加到索引(通常已经指向其他事物)。您可以将多行传递给 git mktree,每行描述一个 blob 或树。

关于git - 不使用暂存区创建树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27279136/

相关文章:

git - 错误!致命的 : Unable to find remote helper for 'https'

git - merge 2个补丁文件

git - 如何判断 merge 请求是否已 merge

git - 当我们的工作流程包含大量未提交的代码时,是否有使用 git-pull 的最佳实践(除了 stash 之外)?

git - git rebase --skip 究竟做了什么?

git - 从未推送的 Git 提交中删除文件(但不是最后一个)

git - 删除本地提交?

python - 如何通过 gitpython 检查 Git Repo 是否有未提交的更改

git submodule update --init 安装 dot-emacs 文件时出错

git - 在 Linux 上通过 ssh 访问 bitbucket.org