Вы игнорируете подмодуль git в своем .gitignore или фиксируете его в своем репо?


94

Я добавил подмодуль к моему проекту в project_dir/vendor/submodule_oneтеперь каждый раз , когда я бегу git statusя получаю modified: vendor/submodule_one (new commits).

Мой вопрос: как лучше с этим справиться? Могу ли я добавить vendor/submodule_one-папку к себе, .gitignoreпоскольку моему основному проекту не нужно знать о специфике моего подмодуля?

Или когда я изменяю и фиксирую изменения в моем подмодуле, мне нужно делать коммиты и в моем основном проекте?

Только начинаю работать с подмодулями и не могу найти много информации, кроме их настройки.

Ответы:


81

Нет, вам не нужно добавлять свой подмодуль в ваш .gitignore: то, что родитель будет видеть из вашего подмодуля, - это gitlink ( специальная записьmode 160000 ).

Это означает: любое изменение, непосредственно сделанное в подмодуле, должно сопровождаться фиксацией в родительском каталоге.
Таким образом, родительский каталог будет записывать правильную фиксацию для состояния подмодуля: эта фиксация - это «gitlink», упомянутый выше;

Вы можете узнать больше об этой политике в « git submodule update (истинная природа подмодулей) ».
Основная идея подмодулей - это компонентный подход , когда вы ссылаетесь на другие репозитории в конкретных коммитах. Но если вы что-то измените в этих подмодулях, вам также необходимо обновить эти ссылки в родительском репо.


Обратите внимание, что с Git 2.13 (второй квартал 2017 г.), не игнорируя gitlink, вы все равно можете игнорировать подмодуль с помощью:

git config submodule.<name>.active false

См. Больше в « Игнорировать новые коммиты для подмодуля git ».


Примечание: с Git 2.15.x / 2.16 (Q1 2018) игнорирование подмодуля является более точным.
" git status --ignored --untracked" не остановился на рабочем дереве отдельного проекта, который встроен в игнорируемый каталог и перечисляет файлы в этом другом проекте, вместо того, чтобы просто показать сам каталог как игнорируемый.

См. Commit fadb482 (25 октября 2017 г.) Йоханнеса Шинделина ( dscho) .
(Объединено Junio ​​C Hamano - gitster- в commit da7996a , 6 ноября 2017 г.)

status: не запутайтесь подмодулями в исключенных каталогах

Мы тщательно передаем excludeфлаг treat_directory()функции, чтобы мы могли указать, что файлы в ней исключаются, а не не отслеживаются при рекурсии.

Но мы еще не относились к субмодулям так же.

Из-за этого git status --ignored --untrackedс подмодулем submoduleв gitignored tracked/подмодуль будет отображаться в разделе " Untracked files", например

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    tracked/submodule/

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/initial.t

Вместо этого мы бы хотели, чтобы подмодуль отображался в разделе " Ignored files":

On branch master
Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/

1
Спасибо VonC, это имеет смысл, когда вы так выразились.
sprysoft

8
Этот ответ сбивает с толку, потому что заголовок вопроса спрашивает, игнорировать ли папки подмодулей или нет, и вы отвечаете утвердительно на отдельный вопрос позже в теле вопроса.
SgtPooki

1
Я думаю, что теперь это имеет гораздо больше смысла и дает очень полезную подробную информацию. Отлично, спасибо за обновление :)
SgtPooki

Аргумент для .gitignore: зачем регистрировать файл .gitsubmodules, если содержащийся в нем URL-адрес может содержать пользовательский URL-адрес git с параметром имени пользователя?
djangofan

1
@djangofan вопрос (и мой ответ) касался игнорирования самой папки подмодуля (той, которая представлена ​​gitlink). Не об игнорировании .gitmodulesфайла. Это правда, что этот единственный файл (эти .gitmodules) может включать учетные данные, но если он используется только для клонирования общедоступных репозиториев, он не должен их включать. Кроме того, их можно в любом случае кэшировать, даже в Windows, с помощью помощников по учетным данным, таких как «Git Credential Manager для Windows» ( github.com/Microsoft/Git-Credential-Manager-for-Windows/… ). Так что наличие верительных грамот - .gitmodulesэто не смертельный исход.
VonC

8

По какой-то причине submodule.module-name.active у меня не работал.

Вот почему я использовал submodule.module-name.ignore

git config submodule.<your module path>.ignore all

https://git-scm.com/docs/gitmodules - здесь вы можете найти описание возможных значений параметра

У меня работает для сообщений (новые коммиты) и (измененное содержимое).


1

Чтобы добавить к принятому ответу, я обнаружил, что добавление папки подмодуля Git в .gitignore на самом деле вызывает проблемы - особенно при попытке создать новый клон проекта. В частности, выполнение обычных команд клонирования подмодуля привело к тому, что папка подмодуля оказалась пустой:

git submodule init
git submodule update
git pull --recurse-submodules

Только попытавшись перезапустить

git submodule add <Git repo> <submodule folder>

было ясно, в чем проблема, исходя из вывода:

The following path is ignored by one of your .gitignore files:
<submodule folder>
Use -f if you really want to add it.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.