协慌网

登录 贡献 社区

使当前提交成为 Git 存储库中唯一的(初始)提交?

我目前有一个本地 Git 存储库,我将其推送到 Github 存储库。

本地存储库有大约 10 个提交,而 Github 存储库是它的同步副本。

我想做的是从本地 Git 存储库中删除所有版本历史记录,因此存储库中的当前内容显示为唯一的提交(因此不会存储存储库中较旧版本的文件)。

然后,我想将这些更改推送到 Github。

我已经研究了 Git 变基,但是这似乎更适合删除特定版本。另一个可能的解决方案是删除本地存储库,然后创建一个新的存储库 - 尽管这可能会导致很多工作!

预计到达时间:有些特定的目录 / 文件无法跟踪 - 如果可能的话,我想保持对这些文件的跟踪。

答案

这是蛮力方法。它还会删除存储库的配置。

注意:如果存储库包含子模块,则此方法不起作用!如果您正在使用子模块,则应使用例如交互式变基

步骤 1:删除所有历史记录(确保已备份,无法还原

cat .git/config  # note <github-uri>
rm -rf .git

步骤 2:仅使用当前内容重建 Git 存储库

git init
git add .
git commit -m "Initial commit"

步骤 3:推送至 GitHub。

git remote add origin <github-uri>
git push -u --force origin master

唯一适用于我(并使子模块保持工作状态)的解决方案是

git checkout --orphan newBranch
git add -A  # Add all files and commit them
git commit
git branch -D master  # Deletes the master branch
git branch -m master  # Rename the current branch to master
git push -f origin master  # Force push master branch to github
git gc --aggressive --prune=all     # remove the old files

当我有子模块时,删除.git/使用git rebase --root会以某种方式对我造成冲突(并且自从我有很多历史以来就花了很长时间)。

这是我最喜欢的方法:

git branch new_branch_name $(echo "commit message" | git commit-tree HEAD^{tree})

这将创建一个带有一次提交的新分支,该分支将所有内容添加到 HEAD 中。它不会改变任何其他内容,因此是完全安全的。