从Git开始,让存储库的最后一次提交成为唯一的提交

Guy*_*Guy 2 git git-commit

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

有没有比创建新回购更好的方法呢?

小智 7

使用以下内容:

$ 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
Run Code Online (Sandbox Code Playgroud)

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

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

接下来你要确保最终状态new-master确实与最终提交状态完全相同master,所以要确保它们的差异以确保(没有差异输出意味着它们是相同的).然后要清理,删除旧master分支并将新分支重命名为它.

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

--orphan <new_branch> [<start_point>]
Run Code Online (Sandbox Code Playgroud)

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

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

当您想要从提交中发布树而不公开其完整历史记录时,这可能很有用.您可能希望这样做以发布项目的开源分支,该分支的当前树是"干净的",但其完整历史记录包含专有或其他受阻的代码.

如果要启动记录一组完全不同的路径的断开连接的历史记录<start_point>,则应在创建孤立分支后立即清除索引和工作树,方法是git rm -rf .从工作的顶层运行" "树.之后,您将准备好准备新文件,重新填充工作树,从其他地方复制它们,提取tarball等.


mil*_*ose 6

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

rm -rf .git/
git init .
Run Code Online (Sandbox Code Playgroud)

即使这样我觉得只是备份~/.git/config~/.git/info/exclude应该足够了.