最佳答案
我想在这个 git 存储库中定义一个新的“ root”分支。我所说的“ root”分支是指完全独立于存储库 1中的所有其他分支的分支。
不幸的是,即使是在回购提交树的最底层的提交(我们称之为 A
)也包含大量文件(这是在一个已经相当成熟的项目上初始化的存储库)。
这意味着,即使我将 A
作为新分支的 <start-point>
,这个新分支也不会从头开始,而是包含在 A
中提交的所有文件。
有没有什么方法可以在这个存储库中创建一个完全空的分支,使 <start-point>
尽可能接近 A
?
1 BTW,这是 没有等价于创建一个新的回购协议。由于许多原因,单独的回购不太方便。
编辑 : 好的,这是我根据 [ em > vcsjones ]的回答所做的:
# save rev of the current earliest commit
OLDBASE=$(git rev-list --max-parents=0 HEAD)
# create a new orphan branch and switch to it
git checkout --orphan newbranch
# make sure it's empty
git rm -rf .
# create a new empty commit in the new branch, and
# save its rev in NEWBASE
git commit --allow-empty -m 'base commit (empty)'
NEWBASE=$(git rev-list HEAD)
# specify $NEWBASE as the new parent for $OLDBASE, and
# run filter-branch on the original branch
echo "$OLDBASE $NEWBASE" > .git/info/grafts
git checkout master
git filter-branch
# NOTE: this assumes that the original repo had only one
# branch; if not, a git-filter-branch -f <branch> command
# need to be run for each additional branch.
rm .git/info/grafts
虽然这个过程有点复杂,但是最终的结果是 空的基提交,它可以作为任何新的“从头开始的分支”的 <start-point>
; 接下来需要做的就是
git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD)
在未来,我将一直创建这样的新存储库:
git init
git commit --allow-empty -m 'base commit (empty)'
... 因此第一次提交是 空荡荡的,并且始终可以启动一个新的独立分支。(我知道,这将是一个非常罕见的设施,但它是相当容易使其随时可用。)