4

我有一个包含几十个提交的 Git 存储库。我希望最后一次提交是唯一的提交——这意味着存储库的行为就像它刚刚初始化一样,并且当前文件状态是唯一的提交。

有没有比创建一个新的 repo 更好的方法呢?

4

2 回答 2

9

使用以下内容:

$ git checkout --orphan new-master master
$ git commit -m "Initial commit for new root"

# Compare new-master with master to double-check that
# their final commit states are identical:
$ git diff new-master master

# If there is no diff/patch output, then they're identical,
# so it's safe to delete master:
$ git branch -D master
$ git branch --move new-master master

--orphan标志创建一个完全独立的提交树,具有不同的根提交。它遵循基本的分支语法,因此后面的参数是新分支的名称,然后是起点,起点可以是任何Git 修订规范,包括提交 sha 或分支名称。

因此,在第一个命令中,您告诉 Git 创建一个新的孤立分支,该分支的状态与分支的当前状态相同master。然后你需要提交新的根,就像你第一次使用你的原始根一样。

接下来,您要确保new-master真正的最终状态与 的最终提交状态相同master,因此对它们进行差异以确保(没有差异输出意味着它们相同)。然后要清理,删除旧master分支并将新分支重命名为它。

这是git-checkout(1) 的官方 Linux Kernel Git 文档--orphan中对标志的解释(我在第一行缺少语法更正):

--orphan <new_branch> [<start_point>]

创建一个新的孤立分支,命名为<new_branch>,开始于<start_point>并切换到它。在这个新分支上进行的第一次提交将没有父母,它将成为与所有其他分支和提交完全断开的新历史的根。

索引和工作树的调整就像您之前运行过一样git checkout <start_point>。这允许您开始一个新的历史记录,该历史记录记录一组类似于<start_point>通过轻松运行git commit -a以进行根提交的路径。

当您想从提交中发布树而不暴露其完整历史时,这可能很有用。您可能希望这样做以发布一个项目的开源分支,该项目的当前树是“干净的”,但其完整历史记录包含专有或其他受累的代码位。

如果你想开始一个断开的历史记录,记录一组完全不同的路径<start_point>,那么你应该在创建孤立分支后立即通过git rm -rf .从工作目录的顶层运行“”来清除索引和工作树。树。之后,您将准备好准备新文件、重新填充工作树、从其他地方复制它们、提取 tarball 等。

于 2013-07-27T22:39:26.303 回答
7

如果您不需要保留 repo 配置,最简单的方法就是这样做

rm -rf .git/
git init .

~/.git/config即便如此,我认为只是备份~/.git/info/exclude应该就足够了。

于 2013-07-27T23:13:11.630 回答