我想在这个git仓库中定义一个新的“根”分支。通过“根”分支,我指的是完全独立于存储库中的所有其他分支的分支。如何创建一个新的(和空的!)“根”分支?
不幸的是,即使是提交(我们称之为A
)在repo的提交树的底部也包含很多文件(这是一个已经在相当成熟的项目上初始化的存储库)。
这意味着即使我将A
作为新分支的<start-point>
,这个新分支不会从“干净的标准”开始,而是它将包含所有在A
中提交的文件。
是否有某种方法可以在此存储库中创建一个完全裸分支,<start-point>
尽可能接近A
?
顺便说一句,这是等效于创建一个新的回购不。由于很多原因,单独的回购将不太方便。
编辑:OK,这是我做的,基于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>
用于任何新的“clean-slate分支”;所有我需要做的就是
git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD)
今后我会一直创造新的存储库这样的:
git init
git commit --allow-empty -m 'base commit (empty)'
......从而使第一承诺是空,始终可用于启动一个新的独立分支。 (这将是的,我知道,一个很少需要的设施,但它是相当费力,使其随时可用。)
重复的http://stackoverflow.com/questions/13969050/how-to-create-a-new-empty-branch-for-a-new-project – Anonymoose 2013-11-04 04:52:22
@ Anonymoose:只是为了记录(而不是辩论):我不同意你的看法。 – kjo 2013-11-04 15:54:59
似乎有一个更简单的解决方案基于'git rebase --onto',请参阅http://stackoverflow.com/questions/645450/insert-a-commit-before-the-root-commit-in-git – 2015-11-11 21:47:50