Alfa Brain

Распаковка 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.



Поделиться: