Я знаю, что git clone --depth=20
часто много намногоменьше, чем 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
?
Навскидку я мог бы сделать следующее (поместить все в одну строку, удалить \):
$ 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
до и после, чтобы увидеть, сколько места сэкономлено.
Проблемы:
git clone
выполнить конкретную фиксацию… см. этот вопрос о стеке :Как клонировать репозиторий git с определенной версией/набором изменений?Согласно моему ответу здесь — на основе других ответов — 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 превратился в