在不使用孤儿标志的情况下创建一个孤儿分支
Create an orphan branch without using the orphan flag
我有一个包含一些分支的现有仓库。我想在该回购协议上创建一个没有任何历史记录的新分支。我正在尝试使用 Dulwich 来执行此操作,它支持大多数 git 操作,但不支持孤儿标志。
在不实际使用该标志的情况下创建孤立分支的等效 Git 操作是什么?理想情况下,我想:
- 克隆存储库
- 使用回购的内容创建一个新分支,但没有历史记录
- 将分支推送到 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
,将我们设置为 "on" 分支。
那么,孤儿分支就是我们 "on" 不存在的分支。
实际分支 创建 发生在我们进行新提交时。所以不是 git checkout
创造了这些;是 git commit
!提交操作基本上包括:
- 将当前索引转为树对象(
git write-tree
);
- 查找当前提交的父 ID(读取
HEAD
并检查未决合并);
- 收集剩余的元数据(作者、提交者、电子邮件地址、时间戳、日志消息);
- 创建一个包含前面步骤的信息的提交对象;
- 通过
HEAD
将新提交对象的哈希 ID 写入当前分支名称(如果 HEAD
已分离,则直接写入 HEAD
)。
第 5 步是创建分支的地方。在第 2 步中,如果 HEAD
命名了一个不存在的分支,它不会提供父哈希 ID,因此新提交没有父项(可能此时没有记录的合并的额外父项)。
If Dulwich 的行为与此处的 Git 相同——很有可能,因为这种处于不存在的分支上的特殊状态是如何Git 引导一个 空 存储库,这是显而易见的方法——然后你需要做的就是直接实现你想要的,就是重写 HEAD
信息(但 Dulwich 存储它)以便它指向这个不存在的分支。
1git checkout -b newbranch
还提供 git checkout -b newbranch startpoint
。使用不同的起点会产生一系列副作用:Git 首先尝试在内部执行 git checkout startpoint
,这可能会对索引和工作树进行任意修改。
我有一个包含一些分支的现有仓库。我想在该回购协议上创建一个没有任何历史记录的新分支。我正在尝试使用 Dulwich 来执行此操作,它支持大多数 git 操作,但不支持孤儿标志。
在不实际使用该标志的情况下创建孤立分支的等效 Git 操作是什么?理想情况下,我想:
- 克隆存储库
- 使用回购的内容创建一个新分支,但没有历史记录
- 将分支推送到 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
,将我们设置为 "on" 分支。
那么,孤儿分支就是我们 "on" 不存在的分支。
实际分支 创建 发生在我们进行新提交时。所以不是 git checkout
创造了这些;是 git commit
!提交操作基本上包括:
- 将当前索引转为树对象(
git write-tree
); - 查找当前提交的父 ID(读取
HEAD
并检查未决合并); - 收集剩余的元数据(作者、提交者、电子邮件地址、时间戳、日志消息);
- 创建一个包含前面步骤的信息的提交对象;
- 通过
HEAD
将新提交对象的哈希 ID 写入当前分支名称(如果HEAD
已分离,则直接写入HEAD
)。
第 5 步是创建分支的地方。在第 2 步中,如果 HEAD
命名了一个不存在的分支,它不会提供父哈希 ID,因此新提交没有父项(可能此时没有记录的合并的额外父项)。
If Dulwich 的行为与此处的 Git 相同——很有可能,因为这种处于不存在的分支上的特殊状态是如何Git 引导一个 空 存储库,这是显而易见的方法——然后你需要做的就是直接实现你想要的,就是重写 HEAD
信息(但 Dulwich 存储它)以便它指向这个不存在的分支。
1git checkout -b newbranch
还提供 git checkout -b newbranch startpoint
。使用不同的起点会产生一系列副作用:Git 首先尝试在内部执行 git checkout startpoint
,这可能会对索引和工作树进行任意修改。