2

刚开始深入使用 github,所以我还在学习。我想使用 python GitHub api(目前我正在使用 PyGithub)来自动创建新分支、提交、发出拉取请求。有几件事让我感到困惑......任何帮助将不胜感激。

  1. 当我使用 api 创建一个新分支时,它需要一个 sha/hash 值。有没有关于我应该如何计算这个哈希值的文档/指南?它可以是任何哈希吗?我注意到,当我在 github.com 上创建一个新分支时,它不需要用户指定哈希值,我猜网站正在为你做这件事,那么生成是基于什么吗?

  2. 仍在学习,但我从官方 git 页面收集到的是,该分支只是哈希值的别名。在试图找出问题 #1 时,我尝试创建两个具有相同哈希值的分支,它可以工作,并且 afaik 所有提交都将转到正确的分支,因此它做正确的事情。但是由于两个分支具有相同的哈希值,那么提交是否应该转到两个分支?

谢谢,克

4

2 回答 2

2

如果您使用的是https://github.com/PyGithub/PyGithub,您可以使用以下命令创建一个分支(如本测试所示Repository.create_git_ref

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

一个分支通常是从另一个分支创建的,这意味着您应该Repository.get_git_ref首先调用,使用您想要开始的分支的名称:这将为您提供 SHA1 以使用 with create_git_ref

于 2019-01-11T06:06:09.703 回答
1

你要在这里找到的关键项目——你的问题的来源——是分支名称在 Git 中根本没有什么意义。它们只是可移动的指针,根据定义,指向分支中的最后一次提交。多个名称可以指向任何单个提交。

在 Git 中,重要的是提交。提交是 Git 存在的理由。提交只需通过创建即可获得哈希 ID,因为与 Git 的所有四种对象类型一样,哈希 ID 是提交内容的加密校验和。由于每个提交都是唯一的——它有一个时间戳来提供帮助,以防提交的其他所有内容与之前的提交相同——每个提交都会获取一个新的、唯一的哈希 ID。

然而,提交哈希 ID 似乎是随机的,人类不可能记住或使用。所以我们需要一些方法来命名我们想要记住的最新提交。这种方式通常带有一个分支名称。一旦我们有一个提交,我们可以指向任意数量的分支名称。

每个提交都会记住它的父或父哈希 ID,因此我们只需要记住分支的最后一次提交或提示——所有较早的提交都可以通过从末尾开始并向后工作来找到。因此分支名称仅标识提示提交。

当 Git 创建一个提交时,Git 只是将新提交的哈希 ID 写入当前分支。当前分支是哪个分支?答案同样简单:特殊名称HEAD包含当前分支的名称。

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

于 2019-01-11T16:49:47.290 回答