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 весит в разы больше рабочего каталога — почти наверняка в историю однажды попал бинарник или дамп.
Связанные термины
- Git — система, которая работает с репозиторием
- Команды Git — push, pull, fetch и remote
- GitHub — хостинг удалённых репозиториев
- Системы контроля версий — общий класс инструментов
- Монорепозиторий — когда в одном репозитории много проектов
- SSH-ключ — чем аутентифицируются при push
Готовы запустить GPU-задачу?
Запустить GPU-сервер