使当前提交在Git仓库中唯一的(初始)提交?

我目前有一个本地的Git仓库,我推到一个Github仓库。

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

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

然后我想把这些改变推到Github上。

我调查了Git rebase,但是这似乎更适合去除特定的版本。 另一个可能的解决scheme是删除本地回购,并创build一个新的 – 虽然这可能会创造很多工作!

ETA:有特定的目录/文件未跟踪 – 如果可能的话,我想保持这些文件的未查询。

这是暴力方法。 它也删除存储库的configuration。

注意 :如果存储库有子模块,这不起作用! 如果你正在使用子模块,你应该使用例如交互式底座

第1步:删除所有的历史logging( 确保你有备份,这是不能恢复

rm -rf .git 

第2步:只用当前内容重buildGit仓库

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

第3步:推送到GitHub。

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

唯一的解决scheme,为我工作(并保持submodules工作)是

 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}) 

这将创build一个新的分支,其中一个提交添加HEAD中的所有内容。 它不会改变任何东西,所以它是完全安全的。

另一个选项,如果你有很多的提交,可能会是一个很大的工作,是一个交互式的rebase(假设你的git版本大于1.7.12): git rebase --root -i

在编辑器中提交提交列表时:

  • 第一次提交时,将“pick”改为“reword”
  • 改变“挑”到“修复”每一个提交

保存并closures。 Git将开始rebasing。

最后你会有一个新的根提交,它是所有后来的根提交的组合。

优点是你不必删除你的仓库,如果你有第二个想法,你总是有一个后备。

如果你真的想要破坏你的历史,重置主要这个提交并删除所有其他分支。

larsmans提出的方法的变种:

保存你的untrackfiles列表:

 git ls-files --others --exclude-standard > /tmp/my_untracked_files 

保存你的gitconfiguration:

 mv .git/config /tmp/ 

然后执行larsmans的第一步:

 rm -rf .git git init git add . 

恢复你的configuration:

 mv /tmp/config .git/ 

解开你未跟踪的文件:

 cat /tmp/my_untracked_files | xargs -0 git rm --cached 

然后提交:

 git commit -m "Initial commit" 

最后推送到您的存储库:

 git push -u --force origin master 

你可以使用浅层克隆 (git> 1.9):

 git clone --depth depth remote-url 

进一步阅读: http : //blogs.atlassian.com/2014/05/handle-big-repositories-git/

创build一个分支,将所有内容复制到它,提交它,然后删除主分支:

 git checkout --orphan newBranch; git add -A ;git commit -am 'first commit' ;git branch -D master;git branch -m master; git push -f origin master; git gc --aggressive --prune=all 

下面的方法是完全可重复的,所以如果双方都一致,就不需要再次运行克隆,只需在另一端运行脚本即可。

 git log -n1 --format=%H >.git/info/grafts git filter-branch -f rm .git/info/grafts 

如果你想清理它,试试这个脚本:

http://sam.nipl.net/b/git-gc-all-ferocious

我写了一个脚本“杀死历史”为每个分支在存储库中:

http://sam.nipl.net/b/git-kill-history

另见: http : //sam.nipl.net/b/confirm

 git for-each-ref --format='git update-ref -d %(refname)' \ refs/{heads,tags} | sh -x current=$(git commit-tree -m 'Initial commit' `git write-tree`) git update-ref -m 'Initial commit' `git symbolic-ref HEAD` $current 

这将删除所有本地分支机构和标签,在当前任何分支上进行一次没有历史logging的提交,并保留您的回购协议的所有其他内容。 然后,您可以强制推送到您的遥控器,只要你喜欢。

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

更概念的答案:

如果没有标签/分支/引用指向他们自动垃圾收集旧的提交。 所以你只需要删除所有的标签/分支,并创build一个新的孤立提交,与任何分支相关联 – 按照惯例,你会让分支master指向那个提交。

旧的,无法访问的提交将不会再被任何人看到,除非他们使用低级别的git命令进行挖掘。 如果这对于你来说已经足够了,我会停下来让GC自动完成任务。 如果你想立即摆脱它们,你可以使用git gc (可能与--aggressive --prune=all )。 对于远程git存储库,虽然你没有办法强制这样做,除非你有shell访问他们的文件系统。

删除.git文件夹可能会导致您的git存储库中的问题。 如果你想删除所有的提交历史。

按照以下步骤

步骤1(结帐)

 git checkout --orphan latest_branch 

步骤2(添加所有文件)

 git add -A 

步骤3(提交更改)

 git commit -am "commit message" 

步骤4(删除分支)

 git branch -D master 

步骤5(将当前分支重命名为主)

 git branch -m master 

第6步(最后一步,强制更新您的存储库)

 git push -f origin master 

现在享受你的提交历史删除!

要从git中删除最后一个提交,你可以简单地运行

 git reset --hard HEAD^ 

如果从顶部删除多个提交,则可以运行

 git reset --hard HEAD~2 

删除最后两个提交。 您可以增加数量以删除更多提交。

更多信息在这里。

这里的Git tutoturial提供了关于如何清除存储库的帮助:

你想从历史中删除文件并将其添加到.gitignore,以确保它不会意外重新提交。 对于我们的示例,我们将从GitHub gem存储库中删除Rakefile。

 git clone https://github.com/defunkt/github-gem.git cd github-gem git filter-branch --force --index-filter \ 'git rm --cached --ignore-unmatch Rakefile' \ --prune-empty --tag-name-filter cat -- --all 

现在,我们已经从历史logging中删除了文件,让我们确保我们不会意外地再次提交。

 echo "Rakefile" >> .gitignore git add .gitignore git commit -m "Add Rakefile to .gitignore" 

如果您对存储库的状态满意,则需要强制推送更改以覆盖远程存储库。

 git push origin master --force 

我解决了一个类似的问题,只需从我的项目中删除.git文件夹,并通过IntelliJ与版本控制重新集成。 注意: .git文件夹是隐藏的。 您可以使用ls -a在terminal中查看它,然后使用rm -rf .git将其删除。

对于那个使用浅的克隆命令git clone –depth 1 URL – 它将只克隆仓库的当前HEAD