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

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

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

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

我已经研究过Git的rebase,但这似乎更适合删除特定版本。另一个可能的解决方案是删除本地回购,并创建一个新的回购-尽管这可能会产生大量工作!

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


当前回答

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

git clone --depth depth remote-url

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

其他回答

这将删除主分支上的历史记录(您可能需要在运行命令之前进行备份):

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

这是基于@dan_waterworth的回答。

larsmans建议方法的变体:

保存未跟踪文件列表:

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

保存git配置:

mv .git/config /tmp/

然后执行larsmans的第一步:

rm -rf .git
git init
git add .

还原配置:

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

另一个选项是交互式rebase(假设您的git版本是>=1.7.12):gitrebase--root-i

当在编辑器中显示提交列表时:

将第一次提交的“pick”更改为“reword”每隔一次提交将“pick”更改为“fixup”

保存并关闭。Git将开始重新定基。

最后,您将有一个新的根提交,它是其后所有提交的组合。

这样做的好处是,您不必删除存储库,如果您有第二个想法,您总是有退路。

如果你真的想破坏你的历史记录,请将master重置为这个提交并删除所有其他分支。

为此,请使用浅层克隆命令gitclone--深度1 URL-它将仅克隆存储库的当前HEAD

要从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

既然我们已经从历史中删除了该文件,让我们确保不要不小心再犯了。

echo "Rakefile" >> .gitignore

git add .gitignore

git commit -m "Add Rakefile to .gitignore"

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

git push origin master --force