Alfa Brain

Распаковка git - Скрипт

Алексей ВечкановАлексей Вечканов   

Для одного из уроков по Git мне понадобился скрипт для удобного просмотра содержимого директории .git (репозитория). (Инструкция для mac и linux)

Все данные, которые мы хотим сохранить в репозитории, Git хранит в специальных объектах. Эти объекты сжимаются с использованием утилиты zlib для экономии места. Впоследствии Git может объединять такие сжатые объекты в специальные пакеты (pack-файлы), чтобы оптимизировать хранение и ускорить доступ к данным.

В корне директории проекта создайте текстовый скрипт unpack_git_objects.sh и добавьте в него содержимое:

1#!/bin/bash
2
3# Целевая директория
4DEST_DIR='./'
5
6# Проверка наличия .git
7if [ ! -d ".git" ]; then
8    echo "Ошибка: текущая директория не содержит .git"
9    exit 1
10fi
11
12# Копируем .git в целевую директорию
13echo "Копирование .git в $DEST_DIR..."
14mkdir -p "$DEST_DIR"
15cp -r .git "$DEST_DIR"
16
17# Переходим в целевую директорию .git с использованием pushd
18pushd "$DEST_DIR/.git" || exit 1
19
20# Создаем директорию для разархивированных объектов
21UNPACKED_DIR="unpacked_objects"
22mkdir -p "$UNPACKED_DIR"
23
24echo "Разархивация объектов с использованием git cat-file..."
25# Перебираем все объекты
26for hash in $(git rev-list --all --objects | awk '{print $1}'); do
27    # Определяем тип объекта (blob, tree, commit и т.д.)
28    obj_type=$(git cat-file -t "$hash")
29    # Извлекаем содержимое объекта
30    git cat-file -p "$hash" > "$UNPACKED_DIR/$hash-$obj_type"
31    echo "Разархивирован объект: $hash ($obj_type)"
32done
33
34echo "Все объекты разархивированы в $DEST_DIR/.git/$UNPACKED_DIR"
35
36# Возвращаемся в исходную директорию с использованием popd
37popd

Сделайте файл исполняемым:

1chmod +x unpack_git_objects.sh

Запустите скрипт:

1./unpack_git_objects.sh

Теперь в директории .git, будет создана директория unpacked_objects в которой будут представлены расшифрованные объекты.

Пример расшифрованных объектов
Пример расшифрованных объектов

Теперь можно удобно просматривать и изучать все объекты git. В целях обучения - идеально.

Что можно сделать еще? Можно добавить команду git decode - которая будет выполнять этот скрипт.

Я работаю на mac, поэтому буду редактировать файл ~/.zshrc, если у вас linux, то добавить нужно в ~/.bashrc

1# Добавляем алиас для GIT
2git() {
3    if [ "$1" = "decode" ]; then
4        # тут расположить сам скрипт
5    else
6        command git "$@"
7    fi
8}

Сохраните файл и перезапустите терминал. Теперь при запуске команды git decode в директории .git будет создаваться директория unpacked_objects с расшифрованными/разархивированными объектами git.



Поделиться: