我知道这git clone --depth=20 <repo>
常常是很多很多小于git clone
.官方文档--depth
。
看起来我对我的存储库文件夹有点疯狂,这是fd
管道式的到wc
和du
,输出:
$ 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
之前和之后,看看节省了多少空间。
问题:
看起来我不能通过评论解决了,谢谢@stephen-kittgit clone
进行特定的提交……请参阅这个 stackoverflow 问题: 如何克隆具有特定修订/变更集的 git 存储库?- 不知道如果我有一堆仅限本地的分支机构、藏品之类的会发生什么
答案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 变成了