git消耗更少磁盘空间的最佳方法是什么?
我在我的存储库上使用git-gc(这确实有帮助,特别是如果自克隆以来有很多提交的话)但我想建议是否有任何其他命令来缩小git使用的磁盘空间。
由于
答案 0 :(得分:46)
我可以提供一些建议:
删除不再使用的分支。他们可以固定一些您不使用但永远不会使用的提交。但请注意不要删除以后需要的分支(可能用于审核或比较失败的工作量)。先备份。
检查您是否错误地提交了一些大型二进制文件(可能是某些生成的文件)。如果你有,你可以使用“git filter-branch”从历史中清除它......好吧,如果你没有共享存储库,或者值得加重其他贡献者来重写历史记录。再次:先备份。
您可以使用git gc --prune=now
或低级git prune
更积极地修剪,丢弃某些安全设备。但请注意,不要删除压缩后需要的安全和备份(如reflog)。
也许扩大存储库的是工作目录中的一些未跟踪文件。 “make clean”或“git clean”可能有所帮助(但请注意不要删除一些重要文件)。
所有这些建议中最安全的是:您可以尝试使用--depth
和--window
git-repack
选项进行更积极的打包。另见Pieter de Bie在2008年6月6日的DVCS比较博客上发表的Git Repack Parameters博客文章。或“git gc --aggressive
”。
答案 1 :(得分:21)
根据您对存储库的要求,您还可以考虑使用以下git clone
选项:
--depth <depth>
Create a shallow clone with a history truncated to the specified
number of revisions. A shallow repository has a number of
limitations (you cannot clone or fetch from it, nor push from nor
into it), but is adequate if you are only interested in the recent
history of a large project with a long history, and would want to
send in fixes as patches.
答案 2 :(得分:11)
git-gc调用许多用于清理和压缩存储库的其他命令。你所能做的就是删除一些旧的未使用的分支。
简答:否: - (
答案 3 :(得分:6)
Git clone现在有一个--single-branch选项,允许你签出一个分支而不需要拉入其他分支的git历史记录。如果git占用大量磁盘空间,因为你有很多分支,你可以删除当前的签出并使用此选项重新克隆repo以重新获得一些磁盘空间。例如:
cd ../
rm -rf ./project
git clone -b master --single-branch git@github.com:username/project.git
此外,如果您当前的主人有很长的历史记录并且您没有任何需要合并回主人的优秀分支,您可以从主人创建归档分支并创建一个没有git历史记录的新孤儿主人:
git checkout -b master_archive_07162013 # create and switch to the archive branch
git push origin master_archive_07162013 # push the archive branch to the remote and track it
git branch -D master # delete local master
git push --delete origin master # delete remote master
git remote prune origin # delete the remote tracking branch
git checkout --orphan master # create a new master branch with no history
git commit -m "initial commit" # re-establish the files in the repo
git push origin master # push the new master to the remote
新的主分支树不会与旧的归档主分支相关联,因此只有在您真正归档分支时才这样做。
如果您将主分支存档,然后使用单分支存档git clone master,那么您的结帐应该要小得多。
答案 4 :(得分:5)
每个git存储库都包含整个历史记录。虽然git在压缩这些东西方面做得相当不错,但其中只有很多数据。
“显而易见”但可能无法解决的问题是启动一个没有旧历史的新存储库。
答案 5 :(得分:3)
Git gc将删除未使用的对象。这就是你可以做的一切。
如果存储库变得太大,您可以考虑拆分存储库。
答案 6 :(得分:2)
您可以重新打包存储库。但我觉得它是由git gc
git repack -ad
答案 7 :(得分:2)
如果您不需要在本地保留所有提交历史记录,则可以使用浅层克隆:
git clone --depth=1 [url_of_repo]
我经常在克隆github项目时使用它,如果我只对最新的文件集感兴趣而不是历史记录。
显然,抓取和推送是不支持浅层克隆,但是我已经能够成功地将更改推送到github repos,因此它也适用于您的情况。 (但毫无疑问,如果你想合并分支机构但在历史上没有基础提交,你会遇到困难。)
我认为从上面显示的新克隆开始会更容易,但其他人已经显示how to trim an existing local repo。
答案 8 :(得分:1)
git prune
可能是一个暗示。它从无法访问的提交中清除存储库(git gc
不会调用它)
答案 9 :(得分:0)
如果你不关心下载大小的傻瓜证明方法是删除存储库(你可以删除整个文件夹)并再次添加它。确保需要保留的所有内容都被推送到服务器!
答案 10 :(得分:-1)
您可能在计算机上克隆了很多git项目,但今天只有少数几个正在积极处理。
在这些空闲项目中,签出的工作文件会占用大量磁盘空间。 (有时甚至比git的历史更大,因为历史被压缩了。)
因此,节省磁盘空间的一种方法是从您未使用的空闲项目中删除工作文件。一个很好的方法是create an empty branch,当你不在项目上工作时可以切换到。{/ p>
您可以做的另一件更激进的事情是删除除.git/config
文件以外的所有内容。或者只删除最大的文件夹,即git history:
rm -rf .git/objects
这将允许您将来再次git fetch
,当您想要恢复历史记录和文件时。在执行此操作之前,您应该确保已将推送所有工作(包括本地分支)到远程存储库,因此您需要的本地git仓库中没有任何内容保留。