使当前提交在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