gpt4 book ai didi

python - 在不使用孤儿标志的情况下创建一个孤儿分支

转载 作者:太空狗 更新时间:2023-10-29 14:42:54 24 4
gpt4 key购买 nike

我有一个包含一些分支的现有仓库。我想在该 repo 协议(protocol)上创建一个没有任何历史记录的新分支。我正在尝试使用 Dulwich 来执行此操作,它支持大多数 git 操作,但不支持孤立标志。

在不实际使用该标志的情况下创建孤立分支的等效 Git 操作是什么?理想情况下,我想:

  • 克隆 repo
  • 用 repo 的内容创建一个新分支,但没有历史
  • 将分支推送到仓库

这是可能的还是我需要创建一个空的新分支,克隆到一个单独的目录并将内容复制回来?

最佳答案

注意:我不使用 Dulwich,因此无法确定。取决于它从头开始重新实现了多少 Git,Git 所做的可能无关紧要。

孤儿分支,在Git中,实际上是一个不存在的分支。 git checkout --orphan newbranch 所做的是将名称 newbranch 写入 HEAD,而不实际创建 newbranch

更具体地说,除了一致性和错误检查之外,1之间的区别:

git checkout -b newbranch

和:

git checkout --orphan newbranch

是前者运行:

git update-ref refs/heads/newbranch HEAD && \
git symbolic-ref HEAD refs/heads/newbranch

后者运行:

git symbolic-ref HEAD refs/heads/newbranch

第一步,git update-ref,实际上创建了分支。

第二步,git symbolic-ref,将我们设置为“在”分支上。

那么,孤儿分支就是我们“所在”的一个不存在的分支。

实际的分支创建发生在稍后,当我们进行新的提交时。所以创建这些的不是 git checkout;这是 git commit!提交操作基本上包括:

  1. 将当前索引转为树对象(git write-tree);
  2. 找到当前提交的父 ID(读取 HEAD 并检查未决 merge );
  3. 收集剩余的元数据(作者、提交者、电子邮件地址、时间戳、日志消息);
  4. 创建一个包含前面步骤信息的提交对象;
  5. 通过 HEAD 将新提交对象的哈希 ID 写入当前分支名称(如果 HEAD 已分离,则直接写入 HEAD)。

第 5 步是创建分支的地方。在第 2 步中,如果 HEAD 命名了一个不存在的分支,它不会提供父哈希 ID,因此新提交没有父项(可能此时没有记录用于 merge 的额外父项) .

如果 Dulwich 在这里的行为与 Git 相同——它很有可能,因为这种位于不存在的分支上的特殊状态是 Git 如何引导一个 存储库,这是很明显的方法——然后你需要做的就是直接实现你想要的是重写 HEAD 信息(不管 Dulwich 存储它),以便它指向这个不存在的分支。


1git checkout -b newbranch 还提供了 git checkout -b newbranch startpoint。使用不同的起点会产生一连串的副作用:Git 首先尝试在内部执行 git checkout startpoint,这可能会对索引和工作树进行任意修改。

关于python - 在不使用孤儿标志的情况下创建一个孤儿分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47078961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com