Skip to content

Instantly share code, notes, and snippets.

@yunusga
Last active January 28, 2020 10:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yunusga/8e9ba61847ecaba83b73e75538344f8b to your computer and use it in GitHub Desktop.
Save yunusga/8e9ba61847ecaba83b73e75538344f8b to your computer and use it in GitHub Desktop.
Git хук для создания ZIP архива текущей ветки

Скрипт позволяет упаковать в ZIP архив активную ветку git репозитория, для экономии места выделяемого под историю изменений.

Плюсы использования этого скрипта

  1. Нет необходимости хранить в истории изменений все архивы которые излишне раздувают размер директории .git храня всю историю изменения для не всегда необходимого архива
  2. При коммите или отправке изменений на сервер, автоматически генерируется свежий архив с обновлённым кодом, очень подходит для заказчика который просит отправлять ему zip обновлённого кода

Важно

Архив должен быть добавлен в .gitignore, иначе толку от такой автоматизации нет, одни проблемы.

Как подключить скрипт к репозиторию

Подключение хуков подробно описано на странице Хуки в Git.

Единственное отличие для установки git хуков на сервере, это необходимость сделать файл хука исполняемым. Для установки прав на исполнение необходимо перейти в директорию вашего репозитория и выполнить это команды:

# это пример, в вашем случае могут быть другие хуки, которые больше подходят именно вам
chmod +x .git/hooks/post-commit
chmod +x .git/hooks/post-receive

Удалённый репозиторий

На удалённом сервере, больше всего подойдут хуки post-commit и post-receive. Почитать про них можно тут (Хуки в Git).

Локальный репозиторий

Для локального репозитория этот скрипт можно добавить в хук post-commit, и получать свежий архив при каждом коммите, но, это излишние действия.

Для локального репозитория можно воспользоваться командой git-а в директории репозитория только когда это необходимо:

git archive <название-ветки> --format zip --output <название-архива>.zip

Исключение файлов для архивации

Предположим, что наш репозиторий имеет такую структуру файлов

└─ cool-project
  ├─ .githooks/
  ├─ marmelad/
  ├─ static/
  ├─ .gitignore
  ├─ .browserlist.rc
  └─ .tarvis-yml

Нам необходимо упаковывать в zip архив только необходимые файлы, т.к. многие из файлов заказчику могут просто не понадобится, или попросту есть файлы в которых содержаться какие-то данные дев-сервера.

Для этого необходимо создать файл .gitattributes и указать в нём те файлы и директории, которые не нужны в создаваемом архиве.

Пример содержания .gitattributes для предполагаемой выше структуры, с указанием файлов и директорий для исключения добавления их в создаваемый архив.

.githooks export-ignore
.gitignore export-ignore
.browserlist.rc export-ignore
.tarvis-yml export-ignore

В итоге, заказчик получит архив только с директориями marmelad и static.

#!/bin/bash
# текущая ветка репозитория
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
# название создаваемого архива
ZIP_NAME="deploy.zip"
# путь до директории репозитория на сервере
# т.к. для post-receive в пути до директории репозитория подставляется /.git
REPO_PATH=$(git rev-parse --show-toplevel)
# удаляем /.git из пути до репозитория
REPO_CLEAN_PATH="${REPO_PATH//\/.git/}"
echo "[$CURRENT_BRANCH] removing $REPO_CLEAN_PATH/$ZIP_NAME..."
# удаляем старый архив если он есть
rm -rf $REPO_PATH/$ZIP_NAME
echo "[$CURRENT_BRANCH] creating $REPO_CLEAN_PATH/$ZIP_NAME..."
# создаём новый архив текущей ветки
git archive $CURRENT_BRANCH --format zip --output $REPO_CLEAN_PATH/$ZIP_NAME
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment