我有一个包含数十个提交的Git存储库。 我希望最后一次提交是唯一的提交 - 这意味着存储库的行为就像刚刚初始化并且当前文件状态是唯一的提交一样。
有没有比创建新回购更好的方法呢?
答案 0 :(得分:6)
使用以下内容:
$ 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 revision specification,包括提交sha或分支名称。
因此,在第一个命令中,您告诉Git以与master
分支的当前状态相同的状态开始创建新的孤立分支。然后你需要提交新的root,就像你第一次使用原始root一样。
接下来,您要确保new-master
的最终状态确实与master
的最终提交状态完全相同,因此要确保它们的差异以确保(没有差异输出意味着它们是相同)。然后要清理,删除旧的master
分支并将新分支重命名为它。
以下是来自official Linux Kernel Git documenation for git-checkout(1)的--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等。
答案 1 :(得分:6)
如果您不需要保留repo配置,那么最简单的方法就是
rm -rf .git/
git init .
即便如此,我认为只需备份~/.git/config
和~/.git/info/exclude
即可。