我正在尝试实施git-remote-helper。到目前为止,我已经设法做出了一个无效的推动:
我使用git log --format=%H <commitHash>
来了解我需要发送的提交
然后git cat-file -p <commitHash>^{tree}
知道我需要通过提交发送哪些对象(我将所有对象的列表放在一个集合中以避免发送两次相同的内容)
我在使用fetch
时遇到了一些问题,因为我不知道需要从遥控器上取出什么对象,我知道最后一次提交(由refs/heads/myBranch
指出)。但是我以前的命令在获取期间不起作用,因为它缺少依赖对象(我试图获取有关它们的信息的对象)
object
并知道它的父代是什么(对于提交)以及它指向的其他对象(提交或树)答案 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来指示它查找要提取或推送的对象集。