问题 从工作树创建一个git树而不触及索引?


我正在创建一个工具,允许人们将“解决方案”存储到测试中。由于我不想重新发明版本控制,我决定使用git的tree / blob / object东西 - 我的想法是从当前工作目录中创建一个git树对象。

问题是我希望这个工具不要触及用户存储库的状态,除了当然要查找现有对象的哈希值。

我看过两者 mktree 和 write-tree,以及前者的需求 ls-tree 输出和后者需要检查索引。这些都不是我想要的。

我很乐意深入研究并为工作树编写这些命令的类比,但是我无法找出任何较低级别的git工具来操作树,blob和对象。

理想情况下,用户将能够运行:

$ git create-tree .

并且git将吐出新创建的树对象的哈希值。


7021
2018-03-07 00:40


起源

我不明白你到底想做什么。您想“不触及用户存储库的状态”,但同时在同一个存储库中创建一个树?你打算如何使用那棵树? - svick
我没有将它用作“历史”,我只是将它用作存储库的一部分的快照。这是非常规的。 - dave paola
好的,但你打算用这个快照做什么?你怎么会把它从回购中拿出来的? - svick
测试套件位于存储库中,需要保留正常的历史记录和可用的git功能。有一系列测试对它们有一定的顺序,但是传递测试的代码不能是存储库 - 相反,目标是说明有一条路径对代码应用更改,以便测试可以通过。 - dave paola


答案:


运用 git mktree 肯定是可行的。它读入 ls-tree格式化的文本,但您可以使用您想要的任何机制自己生成。

也就是说,继续使用索引可能更容易。毕竟,您可以通过自由指定您想要的任何位置作为索引 GIT_INDEX_FILE 环境变量。只需将此var设置为指向某个临时位置,根据需要创建索引,创建树,然后重置env var并丢弃临时索引。


12
2018-03-07 00:49



优秀。我不知何故错过了索引位置是可配置的。谢谢! - dave paola