Работа с подмодулями Git без .gitmodules - PullRequest
2 голосов
/ 26 августа 2011

Меня интересует конкретный случай, когда вы вручную помещаете один репозиторий Git в другой репозиторий Git (либо с помощью git clone, либо путем вставки копий в файловую систему).Я заметил, что когда вы делаете это, происходит следующее:

  1. Git сохранит указатель на определенный коммит, например, с подмодулем.
  2. Git не позволит вам изменять содержимое подпроекта из суперпроекта, как с субмодулем.
  3. git clone в суперпроекте не будет копировать содержимое подпроекта, как в субмодуле.
  4. git submodule не будет работать.Он жалуется на отсутствие .gitmodules.

Я хотел бы знать:

  • Что делает .gitmodules?Его отсутствие - единственное очевидное различие между такой ручной копией и настоящим субмодулем.
  • Есть ли какая-то другая разница, о которой я не знаю?
  • Имеет ли это состояние, скопированное вручную, специальное имя?
  • Есть ли способ переопределить и / или обойти эффекты 3 и 4?(IE: я хочу сделать результирующее хранилище полностью пригодным для использования)

Ответы [ 2 ]

1 голос
/ 26 августа 2011

Я думаю, единственное отличие состоит в том, что подмодуль имеет отношение к своему родителю.Например, вы можете использовать опцию --recursive при клонировании, чтобы получить все подмодули одновременно.В противном случае вам придется выбирать их всех по одному.

0 голосов
/ 15 декабря 2017

Я думаю (я не уверен), что это деталь реализации подмодулей.Если репозиторий добавлен в репозиторий (с использованием git add), то сохраняется не содержимое каталога, а хэш фиксации HEAD (в виде коммита типа, а не в виде дерева типов или большого двоичного объекта).Этот хеш коммита содержит всю информацию, которая вам нужна, если у вас есть вспомогательный репозиторий.Но если у вас есть только супер-репозиторий и хеш коммитов HEAD суб-репозитория, вам все равно нужно получить суб-репозиторий.Эта информация хранится в файле .gitmodules.Если вы вообще не используете пульты дистанционного управления, если вы никогда не клонируете, не перемещаете и не извлекаете свой супер-репозиторий, вы можете использовать субмодули без .gitmodules.Просто добавьте вспомогательные репозитории (например, сторонние библиотеки) в свой репозиторий.Это позволяет отслеживать, какие версии сторонних библиотек использовались для каждого коммита в супер-хранилище.Но это не позволяет клонировать все сразу.Удаленные объекты вложенных репозиториев хранятся только в клонах в рабочем дереве.Если вы отправите супер-репозиторий (в пустой репозиторий), информация о том, где взять субмодули, будет потеряна.

Чтобы понять, как это работает cat-file - очень полезный инструмент, чтобы взглянуть наодиночные объекты git .Коммит содержит сообщение, автора, комитера и обычно ссылку на объект дерева:

$ git cat-file -p 218f61f0ae29941edcc594bde692145f7f1177cc
tree 916a626892af1cd59ff84c3b7d351fca12712806
author lumbric <not-real-adress@gmail.com> 1513291656 +0100
committer lumbric <not-real-adress@gmail.com> 1513291690 +0100

Commit message in the super repository

Объект дерева содержит список других объектов git:

$ git cat-file -p 916a626892af1cd59ff84c3b7d351fca12712806
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    a
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    b
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    c
040000 tree 765b32c65d38f04c4f287abda055818ec0f26912    folder_a
160000 commit 77e2f79e6401f28cab5cf4ca62bb0d58c945f823  sub_repo1

Папки хранятся какдревовидные объекты (содержащие опять-таки множество объектов git) и файлы в виде BLOB-объектов.Подмодуль хранится в виде коммита типа в объекте дерева.Содержимое можно найти в данном хеше в под-хранилище.

С man git-submodule:

Подмодули состоят из так называемой записи дерева ссылок в главном репозитории, котораяотносится к конкретному объекту фиксации во внутреннем репозитории, который является полностью отдельным.Запись в файле .gitmodules (см. Gitmodules (5)) в корне дерева исходного кода присваивает субмодулю логическое имя и описывает URL-адрес по умолчанию, с которого клонируется субмодуль.Логическое имя может использоваться для переопределения этого URL в конфигурации вашего локального репозитория (см. Init субмодуля).

...