首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以在不将Git对象添加到树对象文件系统的情况下从提交中引用它们?

是否可以在不将Git对象添加到树对象文件系统的情况下从提交中引用它们?
EN

Stack Overflow用户
提问于 2021-02-05 23:54:48
回答 2查看 72关注 0票数 0

我可以手动将文件添加到git对象存储区,例如

代码语言:javascript
复制
echo "foo bar" | git hash-object -w --stdin

这将在.git/objects中创建一个包含content foo bar (加上一些头文件)的文件,并按其SHA-1 (或SHA-256,取决于--object-type)散列命名。

然而,现在这是一个悬空的物体。下一次运行git gc时,如果我的对象比设置的修剪时间(默认情况下是2周)旧,该文件将被删除。它也不会被推送到远程存储库,因为它还不能被任何可推送的东西(分支或标签)访问。

要引用它,我可以将它添加到提交对象引用的树对象中,也可以在标记中引用它。

但是,将其添加到树中会将其添加到由其表示的文件系统中(并且必须为其指定一个文件名),并且使用标记引用它不会使其成为提交的merkle-tree的一部分(并且不会因此自动推/拉)。

我希望将一个对象添加到对象存储中,并使其成为我的提交的merkle树的一部分(以便它被推送/拉出并防止垃圾回收),但不会给它一个文件名(即,当签出引用它的提交时,它永远不会出现在.git文件夹之外的临时区域中)。

用香草Git能做到这一点吗?例如,是否可以在不指定文件名的情况下向树对象添加条目?如果是,如何使用?(git write-tree从临时区域获取文件,因此它们需要有文件名。)

或者,是否可以从提交消息中引用对象散列,从而告诉Git此对象是提交的一部分,因此必须与提交一起推送/拉取?

或者git update-index可以用来做这件事?

EN

回答 2

Stack Overflow用户

发布于 2021-02-06 00:44:12

您可以创建一个不与其他分支共享任何历史记录或名称的非分支引用,并将文件添加到其中。在某些情况下,您确实需要跟踪对文件的更改,因此您可以选择在以后执行此操作。

例如:

代码语言:javascript
复制
git checkout --orphan temporary-branch
git reset --hard
git add the_file
git commit -m 'Add the file'
git update-ref refs/hook-metadata/foo temporary-branch
git branch -D temporary-branch

参考资料:

票数 2
EN

Stack Overflow用户

发布于 2021-02-06 15:54:14

用香草Git能做到这一点吗?例如,是否可以在不指定文件名的情况下向树对象添加条目?

不是的。树条目是<模式、名称、hash>元组。模式部分必须是Git定义良好的模式之一: 100644表示不可执行文件,100755表示可执行文件,120000表示符号链接,160000表示gitlink。(模式040000表示树对象,并且只能出现在另一个树对象中。正如您所提到的,git write-tree将索引转换为树,因此通常您会将这些内容放入索引中……这就是git add所做的。索引无法存储模式40000项。您还可以使用git mktree创建树;这就是如何将子树添加到树中。)

Git中的提取代码分为两部分:一部分用于将提交或树读取到Git的索引(git read-tree),另一部分用于读取Git的索引并从索引中的各种符号链接和blob对象创建可用的文件(git checkout-index)。从当前提交切换到新提交的签出或切换操作只需将这两个操作合并到一个方便的(且有用的)命令中。当然,事实证明有大量的重叠,所以git read-tree可以影响工作树,git checkout可以读取或填充索引(虽然这个功能现在在git restore中,如果你不想通过使用拆分的switch--restore命令来避免将所有东西都集中到git checkout中-这相当于承认,它看起来是完全可分离的,但事实证明它并不是...)。

...我想存储一些与钩子一起使用的存储库范围的元数据(特别是用于长期验证提交消息中包含的签名(而不是pgp)的证书链),并且没有理由对这些文件进行修订2.它不应该将一些文件夹结构强加给使用这些钩子的项目。

这里的令人困惑的问题,每一点是:

如果不对文件进行版本控制,

  1. Git将无法存储这些文件。它的底层存储模型是"revisions".

如果不使用主机操作系统来处理文件,

  1. Git就无法真正处理文件。您可以使用git hash-object -wgit cat-file -p等工具任意接近,但最终,几乎可以肯定的是,您必须将文件数据存储在文件中。一个host-OS文件。首先是主机将文件夹结构强加给文件,所以无论如何都绕不开。

您可以尝试灵活处理第2点中的主机操作系统强制结构,以便项目可以按照自己的方式进行操作。您可以简单地将单个提交存储在某个已知的ref名称下,而不在点1中存储任何历史记录(此提交没有父文件),这样版本化文件就会自动“消失”。但是您仍然需要对来自某种目录和文件树结构的文件进行版本控制。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66066417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档