sha / hash для новой ветки github - PullRequest
0 голосов
/ 11 января 2019

Только начал углубленно изучать github, так что я все еще учусь. Я хочу использовать Python GitHub API (в настоящее время я использую PyGithub) для автоматического создания новой ветви, фиксации, выдачи запроса на извлечение. Пары вещей, которые меня смущают ... Любая помощь будет принята с благодарностью.

  1. когда я создаю новую ветку с помощью API, требуется значение sha / hash. Есть ли какие-либо документы / рекомендации о том, как я должен компьютер этот хэш-значение? это может быть просто хэш? Я заметил, что когда я создаю новую ветку на github.com, пользователю не требуется указывать значение хеша, я предполагаю, что веб-сайт делает это для вас, так что генерация основана на чем-то?

  2. все еще учусь, но то, что я понял из официальной git-страницы, это то, что ветка - это просто псевдоним для значения хеш-функции. пытаясь выяснить вопрос № 1, я попытался создать две ветки с одинаковыми хэшами, это работает, и afaik все коммиты переходят в правильную ветвь, поэтому она делает правильные вещи. Но так как две ветви имеют одно и то же значение хеша, должны ли коммиты идти в обе ветви?

Спасибо, K

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Ключевой элемент, к которому вы попадаете - источник вашего вопроса, - это то, что имена веток совсем не значат в Git. Это просто подвижные указатели , которые по определению указывают на последний коммит в ветви. Несколько имен могут указывать на любой коммит.

В Git значение имеет коммит . Это коммит Git's raison d'être . Коммиты получают хеш-идентификатор просто путем создания, потому что, как и все четыре типа объектов Git, хеш-идентификатор является криптографической контрольной суммой содержимого коммита. Поскольку каждый коммит уникален - у него есть временная метка, чтобы помочь, в случае, если все else в коммите совпадает с предыдущим - каждый коммит получает новый уникальный хэш-идентификатор.

Однако хеш-идентификаторы коммитов кажутся случайными и невозможными для запоминания или работы с людьми. Поэтому нам нужен какой-то способ назвать последний коммит, который мы хотим запомнить. Этот способ, как правило, с именем ветви . Получив коммит, мы можем указать на него любое количество имен веток.

Каждый коммит запоминает свои родительские или родительские хеш-идентификаторы, поэтому нам нужно запомнить только последний или tip коммит ветви - все более ранние из них можно найти, начиная с конца и до конца. работает в обратном направлении. Таким образом, имя ветви идентифицирует только tip commit.

Когда Git создает новый коммит, Git просто записывает хэш-идентификатор нового коммита в текущую ветку . Какая ветка является текущей? Ответ на этот вопрос одинаково прост: специальное имя HEAD содержит название текущей ветви.

Важно убедиться, что любой полезный коммит Git доступен по какому-либо имени, потому что Git в конечном итоге соберет мусор любых недостижимых коммитов. То есть, если имя xyz идентифицирует коммит a123456..., этот коммит защищен от сборщика мусора. Так это то, что совершают родители (или родители), бабушки и дедушки и так далее. Git дает вам некоторое время (по умолчанию 14 дней) для подключения, чтобы объекты, включая коммиты, были защищены с помощью этой идеи достижимости: сначала вы создаете объект, такой как BLOB-объект, дерево или коммит, а затем обновляете любое имя ( у) должен был быть в состоянии найти объект и любое его происхождение. Окно 14 дней - это ваш льготный период для обновления имени после создания объекта (ов).

0 голосов
/ 11 января 2019

Если вы используете https://github.com/PyGithub/PyGithub,, вы можете создать ветвь (как в этом тесте ) с Repository.create_git_ref:

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

Ветвь обычно создается из другой ветки, что означает, что вы должны сначала позвонить Repository.get_git_ref, используя имя ветки, с которой вы хотите начать: это даст вам SHA1 для использования с create_git_ref.

...