Ви ігноруєте підмодуль git у своєму .gitignore або привласнюєте його до свого репо?


94

project_dir/vendor/submodule_oneЗараз я додаю підмодуль до свого проекту кожен раз, коли запускаю, git statusщо отримую modified: vendor/submodule_one (new commits).

Моє питання полягає в тому, що найкращий спосіб вирішити це? Чи можу я додати vendor/submodule_one-folder до свого, .gitignoreоскільки моєму основному проекту не потрібно знати про особливості мого підмодуля?

Або коли я змінюю і роблю зміни у своєму підмодулі, мені також потрібно робити коміти у своєму основному проекті?

Тільки розпочавши роботу з підмодулями, я не міг знайти багато інформації, окрім їх налаштування.

Відповіді:


81

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

Це означає: будь-яка зміна, безпосередньо внесена в підмодуль, повинна супроводжуватися комітом у батьківському каталозі.
Таким чином, батьківський каталог буде записувати правильний коміт для стану підмодуля: Цей коміт є "gitlink", згаданим вище;

Детальніше про цю політику ви можете прочитати в " Оновлення підмодуля git (справжня природа підмодулів) ".
Основною ідеєю підмодулів є підхід на основі компонентів , де ви посилаєтесь на інші репозиторії в конкретних комітах. Але якщо ви щось змінили в цих підмодулях, вам також потрібно оновити ці посилання в батьківському репо.


Зверніть увагу, що з Git 2.13 (Q2 2017), хоча не ігноруючи gitlink, ви все одно можете ігнорувати підмодуль за допомогою:

git config submodule.<name>.active false

Докладніше див. У розділі " Ігнорувати нові коміти для підмодуля git ".


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

Див. Коміт fadb482 (25 жовтня 2017 р.) Йоганнеса Шінделіна ( dscho) .
(Об’єднано Junio ​​C Hamano - gitster- у комітеті da7996a , 06 листопада 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-адреса, що міститься в ньому, може містити користувацьку git-адресу з параметром імені користувача?
djangofan

1
@djangofan питання (і моя відповідь) стосувалося ігнорування самої папки підмодуля (тієї, що представляє gitlink). Не про ігнорування .gitmodulesфайлу. Це правда, що цей один файл (the .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.