我有一个带有一些分支的现有仓库。我想创建一个没有任何历史记录的新分支。我正在尝试使用 Dulwich 来做到这一点,它支持大多数 git 操作,但不支持孤儿标志。
在不实际使用该标志的情况下创建孤立分支的等效 Git 操作是什么?理想情况下,我想:
- 克隆回购
- 使用 repo 的内容创建一个新分支,但没有历史记录
- 将分支推送到仓库
这是可能的还是我需要创建一个空的新分支,克隆到一个单独的目录并将内容复制回来?
注意:我不使用德威,也不能肯定地说什么。根据它从头开始重新实现的 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
!提交操作基本上包括:
git write-tree
);HEAD
并检查待处理的合并);HEAD
写入当前分支名称(或直接写入HEAD
if HEAD
is detached)。第 5 步是创建分支的地方。在第 2 步期间,如果HEAD
命名一个不存在的分支,则它不提供父哈希 ID,因此新提交没有父(可能此时没有记录的其他父合并)。
如果Dulwich 在这里的行为与 Git 相同——它很可能,因为在一个不存在的分支上的这种特殊状态,是 Git 如何引导一个空存储库的方式,这是显而易见的方法——那么你所拥有的一切直接实现你想要的就是重写HEAD
信息(但是德威存储它),使其指向这个不存在的分支。
1git checkout -b newbranch
还提供git checkout -b newbranch startpoint
。使用不同的起点会产生一连串的副作用:Git 首先尝试在git checkout startpoint
内部进行,这可能会对索引和工作树进行任意修改。