DevOps & CI/CD

Git-репозиторий

Хранилище проекта вместе со всей историей изменений — папка .git, где Git держит коммиты, ветки и настройки.

Что такое Git-репозиторий

Git-репозиторий — хранилище проекта вместе со всей историей его изменений. Физически это ваш рабочий каталог плюс скрытая папка .git внутри него. Именно .git и есть репозиторий: там лежат все коммиты, ветки, теги и настройки. Удалите её — останутся просто файлы без истории; скопируйте вместе с ней — получите полноценную копию проекта со всем прошлым.

Ключевое свойство Git как распределённой системы: репозиторий у каждого разработчика полный, а не частичный. git log за три года и переключение веток работают локально и без сети — данные уже на диске.

project/
├── .git/            ← репозиторий: вся история здесь
│   ├── objects/     ← коммиты, деревья, содержимое файлов
│   ├── refs/        ← ветки и теги: указатели на коммиты
│   ├── HEAD         ← где вы находитесь сейчас
│   └── config       ← настройки этого репозитория
├── src/             ← рабочий каталог: файлы, которые вы правите
└── .gitignore

Как создают

git init                      # новый репозиторий в текущей папке
git init --bare project.git   # bare-репозиторий для сервера
git clone <url>               # копия существующего: история + рабочие файлы
git clone --depth 1 <url>     # только последний коммит, для CI

Bare-репозиторий

Отдельный тип, о котором стоит знать: bare-репозиторий содержит только .git-часть, без рабочего каталога. Файлов проекта в нём не видно — есть только история.

Именно так устроены репозитории на сервере: git push в обычный репозиторий с рабочим каталогом создал бы конфликт (Git менял бы файлы под руками у того, кто с ними работает). Внутри у GitHub, GitLab и Bitbucket — bare-репозитории.

Свой сервер поднимается без всякого софта — хватает SSH и VPS:

# на сервере
git init --bare /srv/git/project.git

# на клиенте
git clone user@server:/srv/git/project.git

Что такое удалённый репозиторий

Удалённый репозиторий (remote) — копия репозитория на другой машине, с которой вы обмениваетесь коммитами. Локально он представлен коротким именем, чтобы не писать URL каждый раз. По умолчанию при клонировании создаётся remote с именем origin — просто соглашение, никакой магии в этом слове нет.

git remote -v                                 # какие remote настроены
git remote add origin git@github.com:team/project.git
git remote add backup user@server:/srv/git/project.git
git remote set-url origin <new-url>           # сменить адрес

git push origin main
git fetch origin
git branch -r                                 # ветки на remote: origin/main, origin/dev

Remote может быть несколько — это нормальная практика: origin на GitHub и backup на своём сервере, upstream на исходный проект при работе с форком. Ветки вида origin/main — локальный слепок состояния сервера на момент последнего fetch, а не сама серверная ветка.

Что хранить и чего не хранить

Да: исходный код, миграции БД, манифесты Kubernetes, Dockerfile, плейбуки Ansible, документацию, шаблоны конфигов.

Нет: пароли и ключи, сборочные артефакты, node_modules и виртуальные окружения, дампы БД, веса моделей и большие датасеты.

.env
*.key
*.pem
__pycache__/
node_modules/
.venv/
*.safetensors
data/

Git спроектирован для текста: он хранит историю эффективно, вычисляя разницу между версиями. Бинарный файл на 2 ГБ ложится в историю целиком при каждом изменении и остаётся там навсегда, раздувая репозиторий для всех, кто его клонирует. Для больших файлов есть Git LFS и DVC, для весов моделей — model registry или object storage.

Про секреты правило жёсткое: попавший в историю ключ считается скомпрометированным. Удалить его новым коммитом недостаточно — он остаётся во всех клонах и в истории. Единственный корректный путь — отозвать и перевыпустить.

Гигиена репозитория

du -sh .git                   # размер истории
git count-objects -vH         # что занимает место
git gc                        # упаковать объекты
git log --oneline --graph -20 # как выглядит история

Если .git весит в разы больше рабочего каталога — почти наверняка в историю однажды попал бинарник или дамп.

Связанные термины

Готовы запустить GPU-задачу?

Запустить GPU-сервер