获取有关特定对象的信息

时间:2017-02-07 11:55:36

标签: git

我正在尝试实施git-remote-helper。到目前为止,我已经设法做出了一个无效的推动:

我使用git log --format=%H <commitHash>来了解我需要发送的提交

然后git cat-file -p <commitHash>^{tree}知道我需要通过提交发送哪些对象(我将所有对象的列表放在一个集合中以避免发送两次相同的内容)

我在使用fetch时遇到了一些问题,因为我不知道需要从遥控器上取出什么对象,我知道最后一次提交(由refs/heads/myBranch指出)。但是我以前的命令在获取期间不起作用,因为它缺少依赖对象(我试图获取有关它们的信息的对象)

  • 我的问题是:我应该使用哪些命令来读取object并知道它的父代是什么(对于提交)以及它指向的其他对象(提交或树)

1 个答案:

答案 0 :(得分:0)

我不清楚你打算如何处理所有这些,这会影响正确的方式&#34;尽管说效率最高实际去做的方法。尽管如此,git cat-file几乎是 &#34;外部程序&#34;在Git中访问所有内容的方法。要读取一个对象,你需要一个名称 - SHA-1哈希是显而易见的名称,因为它的 名称,但任何适合git rev-parse的东西都足够了 - git cat-file在其各种版本中会将其转储,可能会应用一些格式,甚至可以使用--textconv--path过滤。

请注意,您需要递归操作:获取提交会获取其tree,其所有parent,作者和提交者以及日志。获取tree个对象可以获得它的组成子树和blob,但每个子树可能有更多的子树,这是递归设置的位置。应用于最终blob的路径(包括符号链接和gitlinks) )通过递归确定,即,如果顶级树是 T ,并且您找到子树 D1 ,其组件名称为 N1 ,包含子树 D2 命名为 N2 ,包含名为 N3 的blob B B 下的路径名>存储的是N1/N2/N3。 (你可能不需要关心路径,这取决于你正在做什么 - 例如,Git自己的推送和获取操作不必关心,因为它只是存储这些对象在存储库中,路径名构造稍后会在git checkout期间发生。)

同样,获取带注释的标记对象会获得object,但这可能是另一个带注释的标记对象,您必须继续遵循这些ID,直到找到非标记(尽管有这些标记)这次没有递归,因为它们没有嵌套)。

所有这一切,git rev-list实际上为Git自己的传输实现了所有这些goop。这就是为什么git rev-list具有--objects和相关选项的原因:you-或Git-可以使用存储在各种引用名称中的哈希ID来指示它查找要提取或推送的对象集。