sha / hash用于新的github分支

时间:2019-01-11 03:03:45

标签: git github hash pygithub

只是开始深入使用github,所以即时通讯仍在学习中。我想使用python GitHub api(当前使用的是PyGithub)来创建新分支,提交,自动发出拉取请求。几件事让我感到困惑...任何帮助将不胜感激。

  1. 当我使用api创建新分支时,它需要一个sha / hash值。关于我应如何计算此哈希值,是否有任何文档/指南?可以是任何哈希吗?我注意到,当我在github.com上创建一个新分支时,它不需要用户指定哈希值,我猜该网站正在为您执行此操作,因此生成是否基于某些内容?

  2. 仍在研究,但我从官方git页面收集的信息是,该分支只是哈希值的别名。在尝试找出问题#1时,我尝试创建具有相同哈希值的两个分支,它起作用了,并且afaik所有提交都将移至正确的分支,因此其作用正确。但是,由于两个分支具有相同的哈希值,提交是否应该同时到达两个分支?

谢谢, K

2 个答案:

答案 0 :(得分:1)

如果您使用的是https://github.com/PyGithub/PyGithub,则可以使用in this test创建分支(如Repository.create_git_ref):

ref = self.repo.create_git_ref("refs/heads/BranchCreatedByPyGithub", "4303c5b90e2216d927155e9609436ccb8984c495")

通常从另一个分支创建一个分支,这意味着您应该首先使用要从其开始的分支的名称来调用Repository.get_git_ref:这将使SHA1与{{1}一起使用}。

答案 1 :(得分:0)

您要到达此处的关键项目(问题的根源)是分支名称在Git中根本没有多大意义。它们只是可移动指针,根据定义,它们指向分支中的 last 提交。多个名称可以指向任何单个提交。

在Git中,重要的是 commits 。提交是Git的raison d'être。提交只需通过创建就可以获取哈希ID,因为像所有Git的四种对象类型一样,哈希ID是提交内容的加密校验和。由于每个提交都是唯一的-如果有关提交的所有 else 与较早的提交都相同,则它具有时间戳记,因此每个提交都将获取一个新的唯一哈希ID。

但是,提交哈希ID似乎是随机的,人类无法记住或使用。因此,我们需要某种方式来命名我们要记住的最新提交。通常,这种方式使用分支名称。提交后,可以指向任意数量的分支名称。

每个提交都记住其父级或父级哈希ID,因此我们只需要记住分支的最后一个提交,即 tip ,所有较早的提交都可以从末尾开始查找并向后工作。因此,分支名称仅标识 tip 提交。

当Git创建一个 new 提交时,Git只需将新提交的哈希ID写入 current分支。当前分支是哪个分支?答案也很简单:特殊名称HEAD保存当前分支的名称。

重要的是要确保任何有用的Git提交都可以通过 命名,因为Git最终会垃圾收集任何不可达的提交。也就是说,如果名称xyz标识提交a123456...,则该提交不受垃圾收集器的保护。因此,提交者的父母(或父母)和祖父母等等。 Git给您一些时间(默认情况下为14天)来挂接事物,以便通过这种可达性思想保护对象(包括提交):首先创建一个对象(例如blob或tree或commit),然后更新任何名称( s)需要能够找到对象及其任何祖先。在创建对象之后,14天的窗口是您完成名称更新的宽限期。