在不使用孤立标志的情况下创建孤立分支

时间:2017-11-02 15:27:44

标签: python git dulwich

我有一些现有的回购分支。我想在该回购中创建一个没有任何历史记录的新分支。我正在尝试使用Dulwich,它支持大多数git操作,但不是孤儿标志。

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

  • 克隆回购
  • 使用repo的内容创建一个新分支,但没有历史记录
  • 将分支推送到回购

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

1 个答案:

答案 0 :(得分:2)

注意:我不使用德威,也不能确定任何事情。根据从头开始重新实现的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并检查待处理的合并);
  3. 收集剩余的元数据(作者,提交者,电子邮件地址,时间戳,日志消息);
  4. 创建一个提交对象,其中包含前面步骤中的信息;
  5. 通过HEAD将新提交对象的哈希ID写入当前分支名称(如果HEAD已分离,则直接写入HEAD。)
  6. 步骤5是创建分支的地方。在步骤2期间,如果HEAD命名不存在的分支,则它不提供父哈希ID,因此新提交没有父项(可能此时没有记录的其他父项用于合并)。

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

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