我有一个克隆.我想减少它的历史,而不是从头开始克隆,减少深度.工作示例:
$ git clone git@github.com:apache/spark.git
# ...
$ cd spark/
$ du -hs .git
193M .git
Run Code Online (Sandbox Code Playgroud)
好吧,所以不是这样,但它会为这次讨论服务.如果我尝试gc它会变小:
$ git gc --aggressive
Counting objects: 380616, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (278136/278136), done.
Writing objects: 100% (380616/380616), done.
Total 380616 (delta 182748), reused 192702 (delta 0)
Checking connectivity: 380616, done.
$ du -hs .git
108M .git
Run Code Online (Sandbox Code Playgroud)
尽管如此,相当大(git pull表明它仍然可以向遥控器推送/拉动).重新包装怎么样?
$ git repack -a -d --depth=5
Counting objects: 380616, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (95388/95388), done.
Writing objects: 100% (380616/380616), done.
Total 380616 (delta 182748), reused 380616 (delta 182748)
Pauls-MBA:spark paul$ du -hs .git
108M .git
Run Code Online (Sandbox Code Playgroud)
是的,没有变小. - 重新包装的深度与克隆不同:
$ git clone --depth 1 git@github.com:apache/spark.git
Cloning into 'spark'...
remote: Counting objects: 8520, done.
remote: Compressing objects: 100% (6611/6611), done.
remote: Total 8520 (delta 1448), reused 5101 (delta 710), pack-reused 0
Receiving objects: 100% (8520/8520), 14.82 MiB | 3.63 MiB/s, done.
Resolving deltas: 100% (1448/1448), done.
Checking connectivity... done.
Checking out files: 100% (13386/13386), done.
$ cd spark
$ du -hs .git
17M .git
Run Code Online (Sandbox Code Playgroud)
Git pull表示它仍然与遥控器同步,这让任何人都感到惊讶.
好的 - 那么如何将现有的克隆更改为浅克隆,而不是将其复制并重新检查出来?
jth*_*ill 14
git clone --mirror --depth=5 file://$PWD ../temp
rm -rf .git/objects
mv ../temp/{shallow,objects} .git
rm -rf ../temp
Run Code Online (Sandbox Code Playgroud)
这真的不是"从头开始"克隆,因为它纯粹是本地工作,它实际上只创建了浅出的包文件,可能总计数十千字节.我冒昧地说你不会比这更有效率,你最终将使用脚本和测试工作形式使用更多空间的自定义工作,而不是以几kb的临时仓库开销的形式.
les*_*ana 13
至少git版本2.14.1有
git fetch --depth 10
Run Code Online (Sandbox Code Playgroud)
这将从原点获取最新的提交,如果有的话,然后切断(或延长)本地历史到10的深度.
切断提交将无法通过常规方式访问,但仍会在存储库中停留.如果没有其他引用持有它们,那么它们最终将被自动删除git gc.
您也可以立即删除旧的提交.为此,您必须删除可能包含它们的所有引用.这主要是reflog和标签.然后运行git gc.
请注意,reflog会在一段时间后自行清除,但标记将永远保留.因此,如果要从旧提交中回收磁盘空间,则必须手动删除标记.
如果您已删除标记,则下一个git fetch将仅重新获取与存储库中当前提交相关的标记.
清除reflog:
git reflog expire --expire=all --all
Run Code Online (Sandbox Code Playgroud)
删除所有标签:
git tag -l | xargs git tag -d
Run Code Online (Sandbox Code Playgroud)
删除所有悬空物体:
git gc --prune=all
Run Code Online (Sandbox Code Playgroud)