kae*_*ese 631 git github git-commit
我目前有一个本地Git存储库,我将其推送到Github存储库.
本地存储库有~10个提交,Github存储库是这个的同步副本.
我想要做的是从本地Git存储库中删除所有版本历史记录,因此存储库的当前内容显示为唯一的提交(因此存储库中的旧版本文件不会存储).
然后,我想将这些更改推送到Github.
我已经调查了Git rebase,但这似乎更适合删除特定版本.另一个可能的解决方案是删除本地仓库,并创建一个新的仓库 - 虽然这可能会创造很多工作!
ETA:有一些未跟踪的特定目录/文件 - 如果可能的话,我想保持这些文件的跟踪.
Fre*_*Foo 950
这是蛮力的方法.它还会删除存储库的配置.
注意:如果存储库有子模块,这不起作用!如果您正在使用子模块,则应使用例如交互式rebase
第1步:删除所有历史记录(确保您有备份,这不能还原)
cat .git/config # note <github-uri>
rm -rf .git
Run Code Online (Sandbox Code Playgroud)
第2步:仅使用当前内容重建Git仓库
git init
git add .
git commit -m "Initial commit"
Run Code Online (Sandbox Code Playgroud)
第3步:推送到GitHub.
git remote add origin <github-uri>
git push -u --force origin master
Run Code Online (Sandbox Code Playgroud)
小智 575
唯一适合我的解决方案(并保持子模块正常工作)是
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
Run Code Online (Sandbox Code Playgroud)
.git/当我有子模块时,删除总是会导致巨大的问题.使用git rebase --root会以某种方式导致我的冲突(并且需要很长时间,因为我有很多历史).
dan*_*rth 89
这是我最喜欢的方法:
git branch new_branch_name $(echo "commit message" | git commit-tree HEAD^{tree})
Run Code Online (Sandbox Code Playgroud)
这将创建一个新分支,其中一个提交会在HEAD中添加所有内容.它不会改变任何其他东西,所以它是完全安全的.
Car*_*arl 31
另一个选项,如果你有很多提交,可能会成为很多工作,是一个交互式rebase(假设你的git版本> = 1.7.12):git rebase --root -i
在编辑器中显示提交列表时:
保存并关闭.Git将开始变基础.
最后,您将拥有一个新的根提交,它是所有提交后的提交的组合.
优点是您不必删除您的存储库,如果您有第二个想法,您总是有一个后备.
如果您确实想要查看历史记录,请将master重置为此提交并删除所有其他分支.
lal*_*rde 18
larsmans提出的方法的变体:
保存未记录文件列表:
git ls-files --others --exclude-standard > /tmp/my_untracked_files
Run Code Online (Sandbox Code Playgroud)
保存你的git配置:
mv .git/config /tmp/
Run Code Online (Sandbox Code Playgroud)
然后执行larsmans的第一步:
rm -rf .git
git init
git add .
Run Code Online (Sandbox Code Playgroud)
恢复配置:
mv /tmp/config .git/
Run Code Online (Sandbox Code Playgroud)
取消您未跟踪的文件:
cat /tmp/my_untracked_files | xargs -0 git rm --cached
Run Code Online (Sandbox Code Playgroud)
然后提交:
git commit -m "Initial commit"
Run Code Online (Sandbox Code Playgroud)
最后推送到您的存储库:
git push -u --force origin master
Run Code Online (Sandbox Code Playgroud)
这将删除分支上的历史记录master(您可能需要在运行命令之前进行备份):
git branch tmp_branch $(echo "commit message" | git commit-tree HEAD^{tree})
git checkout tmp_branch
git branch -D master
git branch -m master
git push -f --set-upstream origin master
Run Code Online (Sandbox Code Playgroud)
这是基于@dan_waterworth 的回答。
你可以使用浅克隆(git> 1.9):
git clone --depth depth remote-url
Run Code Online (Sandbox Code Playgroud)
进一步阅读:http://blogs.atlassian.com/2014/05/handle-big-repositories-git/
只需删除 Github 存储库并创建一个新的即可。迄今为止最快、最简单、最安全的方法。毕竟,当您想要的只是一次提交的主分支时,在已接受的解决方案中执行所有这些命令您必须获得什么?
以下是根据@Zeelot的答案改编而成的脚本。它应该删除所有分支的历史记录,而不仅仅是master分支:
for BR in $(git branch); do
git checkout $BR
git checkout --orphan ${BR}_temp
git commit -m "Initial commit"
git branch -D $BR
git branch -m $BR
done;
git gc --aggressive --prune=all
Run Code Online (Sandbox Code Playgroud)
它出于我的目的而工作(我不使用子模块)。
| 归档时间: |
|
| 查看次数: |
227163 次 |
| 最近记录: |