Как зафиксировать версию модуля или зависимости в Git?

«Как зафиксировать версию модуля или зависимости в Git?» — вопрос из категории Git, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В DevOps-практике для управления версиями зависимостей и модулей используются несколько подходов, часто в комбинации с Git.

1. Git Submodules (Подмодули) Используется, когда нужно включить другой Git-репозиторий как подкаталог в вашем проекте, зафиксировав конкретный коммит.

# Добавить подмодуль, указывающий на конкретную ветку
git submodule add -b main https://github.com/example/another-repo.git lib/another-repo

# Инициализировать и обновить все подмодули (после клонирования)
git submodule update --init --recursive

# Зафиксировать текущее состояние подмодулей (коммиты) в основном репозитории
git add .gitmodules lib/another-repo
git commit -m "Add submodule at specific commit"
  • Плюс: Прямая привязка к коммиту.
  • Минус: Усложняет workflow, требует ручного обновления.

2. Git Tags (Теги) + Менеджеры зависимостей Наиболее распространенный подход. Репозиторий модуля помечается семантическими тегами (v1.2.3), а основной проект ссылается на этот тег через файл зависимостей.

  • Для Go (go.mod):
    module github.com/my/project
    require github.com/example/module v1.2.3 // Указывается тег напрямую
  • Для Node.js (package.json):
    {
      "dependencies": {
        "some-package": "git+https://github.com/user/repo.git#v1.0.0"
      }
    }
  • Для Python (requirements.txt / pyproject.toml):
    # requirements.txt
    git+https://github.com/user/repo.git@v1.0.0#egg=package-name
    # pyproject.toml (Poetry)
    [tool.poetry.dependencies]
    my-package = {git = "https://github.com/user/repo.git", tag = "v1.0.0"}

3. Монополи (Monorepo) Все модули/сервисы хранятся в одном репозитории. Версии синхронизированы по умолчанию, так как изменения происходят в одном коммите. Управление осуществляется через инструменты вроде Bazel, Nx, Lerna или Turborepo.

Рекомендация: Для внутренних библиотек в DevOps-цепочке часто используют теги + менеджер пакетов (например, внутренний Nexus, Artifactory, GitHub Packages) для бинарных артефактов, а Git используется как источник истины для исходного кода.