git - 如何创建一个新的(空的!) "root"分支?

标签 git

我想在此 git 存储库中定义一个新的“根”分支。 “根”分支是指完全独立于存储库1 中所有其他分支的分支。

不幸的是,即使是存储库提交树最底部的提交(我们称之为 A )也包含很多文件(这是一个在已经相当成熟的项目上初始化的存储库)。

这意味着即使我给了A作为新分支的<start-point> ,这个新分支不会从“干净的状态”开始,而是包含在 A 中提交的所有文件。 .

有什么方法可以在这个存储库中创建一个完全裸分支,使用 <start-point>接近A尽可能?


1顺便说一句,这等同于创建一个新的存储库。出于很多原因,单独的 repo 协议(protocol)不太方便。


编辑:好的,这就是我所做的,基于 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)'

...所以第一个提交是,并且始终可用于启动一个新的独立分支。 (我知道,这将是一个很少需要的设施,但要使其随时可用并不费力。)

最佳答案

创建分支时使用--orphan:

git checkout --orphan YourBranchName

这将创建一个零提交的新分支,但是您的所有文件都将被暂存。那时你可以删除它们。
(“删除它们”:git reset --hard 将清空索引,留下一个空的工作树)

看看 man page checkout 以获取有关 --orphan 的更多信息。

关于git - 如何创建一个新的(空的!) "root"分支?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15034390/

相关文章:

github Diff 截断错误

Git 从原点 merge 分支

git: checkout 分支中的所有文件(但留在当前分支)

Git 修订列表 : exclude commits already included in a merge

.net - Mercurial 或 git 哪个有更好的 .NET 实现?

git - 如何在 github 提交中设置用户名别名?

git - 我如何知道 git server 使用哪种授权方法?

git - Drupal Sandbox git 存储库这么大? ( 打包文件大小 : 21MB)

node.js - 如何将 git 存储库添加到 Ubuntu 服务器

git - apt-get 在 Ubuntu 12.04 上找不到包 `git`