Mein Git-Verzeichnis ist mittlerweile richtig groß geworden: Über 65GB.
Ich weiß, dass da viel Schrott dabei ist, den ich so nicht mehr
benötige. Konkret gibt es viele Git-Clones von Git-Servern,
die längst nicht mehr zur Verfügung stehen. Hier beschreibe ich,
wie ich diese Clones finde und bereinige.
Randbedingungen
Bei mir gilt:
Alle Git-Projekte liegen unterhalb von “$HOME/git”
Alle Git-Projekte sind in einem Backup gesichert. ich kann also relativ
offensiv löschen
Alle Git-Projekte enthalten keine merkwürdigen Zeichen wie Leerzeichen im Verzeichnisnamen
Alle Git-Servernamen (git remotes) enthalten keine merkwürdigen Zeichen wie Leerzeichen
Git-Projektverzeichnisse finden
Unterhalb von “$HOME/git” liegen die Git-Projekte.
Diese sind teilweise in Unterverzeichnissen.
Also Ziel 1: Ermutteln der Git-Projektverzeichnisse:
Die Zeilen, die mit “KO:” beginnen, zeigen Git-Projektverzeichnisse
an, die keinen funktionierenden Git-Server hinterlegt haben.
Ich denke, diese werde ich löschen!
Die Zeilen, die mit “OK:” beginnen, zeigen Git-Projektverzeichnisse
an, die mindestens einen nucht funktionierenden Git-Server hinterlegt haben.
Ich denke, diese ich werde ich bereinigen!
Komplettes Kommando:
1234567891011121314151617181920212223242526
find "${HOME}/git" -name ".git" -type d \
|xargs -n1 dirname \
|while read d; do ( \
cd "$d"; \
if git remote -v update >/dev/null 2>&1; then \
echo "OK: $d"; \
else \
echo "KO: $d"; \
fi \
); done \
|grep "^KO:" \
|cut -d " " -f 2- \
|while read d; do ( \
STATUS=KO; \
REMOTE_STATUS=; \
cd "$d"; \
for r in $(git remote); do \
if git remote -v update "${r}" >/dev/null 2>&1; then\
REMOTE_STATUS="${REMOTE_STATUS} ${r}:OK";\
STATUS=OK; \
else \
REMOTE_STATUS="${REMOTE_STATUS} ${r}:KO";\
fi; \
done; \
echo "${STATUS}: ${d} ${REMOTE_STATUS}";\
); done
Git-Projektverzeichnisse bereinigen
Diejenigen Git-Projektverzeichnisse, bei denen nicht erreichbare
Git-Server hinterlegt sind, werden bereinigt. Ich lösche die
nicht erreichbaren Git-Server:
1234567891011121314
$ cat /tmp/git-remotes-status \
|grep "^OK: " \
|cut -d " " -f 2 \
|while read d; do test -d "${d}" && echo "${d}"; done\
|while read d; do ( \
cd "${d}" || exit 0; \
for r in $(git remote); do \
git remote -v update "${r}" >/dev/null 2>&1 || echo "( cd '$(pwd)'; git remote remove '${r}' )"; \
done \
); done | tee /tmp/git-remove-remotes
( cd '/home/uli/git/dpserver'; git remote remove 'gitbucket' )
( cd '/home/uli/git/forked/mdwiki'; git remote remove 'ciel' )
( cd '/home/uli/git/forked/dl'; git remote remove 'origin' )
...
Es werden die Befehle ausgegeben, die zum Löschen der nicht
erreichbaren Git-Server ausgeführt werden müssen.
Befehle sichten und ausführen!