将我所有的 git 存储库切换到深度 20,以节省空间?

将我所有的 git 存储库切换到深度 20,以节省空间?

我知道这git clone --depth=20 <repo>常常是很多很多小于git clone.官方文档--depth

看起来我对我的存储库文件夹有点疯狂,这是fd 管道式的wcdu,输出:

$ declare -r ALL_GIT="$(fd -HIFt d '.git')"
$ echo "$ALL_GIT" | wc -l
1528
$ echo "$ALL_GIT" | du -hs
du: cannot access './freebsd/contrib/bmake/PSD.doc/tutorial.ms': Permission denied
du: cannot access './freebsd/contrib/bmake/PSD.doc/Makefile': Permission denied
du: cannot access './statsmodels/statsmodels/statsmodels/datasets/macrodata/src/macrodata.xls/macrodata.xls': Permission denied
44G .

是否有一些命令可以用来删除所有历史记录并修剪所有早于 的孤儿20

答案1

我突然想到可以执行以下操作(将所有内容放在一行,删除 \):

$ fd -HIFt d '.git' -x bash -c 'config_bk="$(mktemp)"; 
                                git_bk="$(mktemp -d)"; \
                                git clone --depth=20 "$0" "$git_bk"; \
                                mv "$0"/.git/config "$config_bk"; \
                                rm -rf "$0"/.git; \
                                mv "$git_bk"/.git "$0";
                                mv "$config_bk" "$0"/.git;' {//}

未经测试! - 为了踢球,做一个df之前和之后,看看节省了多少空间。

问题:

答案2

根据我在这里的答案(基于那里的其他答案)https://stackoverflow.com/a/62650346,并且正如@muru所提到的,以下是有效的:

git pull --depth 20
git tag -d $(git tag -l)
git reflog expire --expire=all --all
git gc --prune=all

想要通过在整个磁盘上运行它来节省空间吗? - 然后运行这个fd命令:

fd -HIFt d '.git' -x bash -c 'pushd "$0" && ( git pull --depth 20; git tag -d $(git tag -l); git reflog expire --expire=all --all; git gc --prune=all ) && popd' {//}

或者只是常规的find

find -type d -name '.git' -exec bash -c 'pushd "${0%/*}" && ( git pull --depth 20; git tag -d $(git tag -l); git reflog expire --expire=all --all; git gc --prune=all ) && popd' {} \;

这对我意味着什么? - 那么前面提到的 44G 变成了

相关内容