Распаковка git - Скрипт
Для одного из уроков по Git мне понадобился скрипт для удобного просмотра содержимого директории .git (репозитория). (Инструкция для mac и linux)
Все данные, которые мы хотим сохранить в репозитории, Git хранит в специальных объектах. Эти объекты сжимаются с использованием утилиты zlib для экономии места. Впоследствии Git может объединять такие сжатые объекты в специальные пакеты (pack-файлы), чтобы оптимизировать хранение и ускорить доступ к данным.
В корне директории проекта создайте текстовый скрипт unpack_git_objects.sh и добавьте в него содержимое:
#!/bin/bash
# Целевая директория
DEST_DIR='./'
# Проверка наличия .git
if [ ! -d ".git" ]; then
echo "Ошибка: текущая директория не содержит .git"
exit 1
fi
# Копируем .git в целевую директорию
echo "Копирование .git в $DEST_DIR..."
mkdir -p "$DEST_DIR"
cp -r .git "$DEST_DIR"
# Переходим в целевую директорию .git с использованием pushd
pushd "$DEST_DIR/.git" || exit 1
# Создаем директорию для разархивированных объектов
UNPACKED_DIR="unpacked_objects"
mkdir -p "$UNPACKED_DIR"
echo "Разархивация объектов с использованием git cat-file..."
# Перебираем все объекты
for hash in $(git rev-list --all --objects | awk '{print $1}'); do
# Определяем тип объекта (blob, tree, commit и т.д.)
obj_type=$(git cat-file -t "$hash")
# Извлекаем содержимое объекта
git cat-file -p "$hash" > "$UNPACKED_DIR/$hash-$obj_type"
echo "Разархивирован объект: $hash ($obj_type)"
done
echo "Все объекты разархивированы в $DEST_DIR/.git/$UNPACKED_DIR"
# Возвращаемся в исходную директорию с использованием popd
popd
Сделайте файл исполняемым:
chmod +x unpack_git_objects.sh
Запустите скрипт:
./unpack_git_objects.sh
Теперь в директории .git, будет создана директория unpacked_objects в которой будут представлены расшифрованные объекты.
Теперь можно удобно просматривать и изучать все объекты git. В целях обучения - идеально.
Что можно сделать еще? Можно добавить команду git decode - которая будет выполнять этот скрипт.
Я работаю на mac, поэтому буду редактировать файл ~/.zshrc, если у вас linux, то добавить нужно в ~/.bashrc
# Добавляем алиас для GIT git() { if [ "$1" = "decode" ]; then # тут расположить сам скрипт else command git "$@" fi }
Сохраните файл и перезапустите терминал. Теперь при запуске команды git decode в директории .git будет создаваться директория unpacked_objects с расшифрованными/разархивированными объектами git.