Відмінності між підмодулем git та піддією


300

У чому полягають концептуальні відмінності між використанням git підмодуля та піддіаграмою?

Які типові сценарії для кожного?


3
Це може не відповісти на всі ваші запитання, але цікаво читати на тему: blogs.atlassian.com/2013/05/…
Chop


"Альтернативи Git подмодулей?": Stackoverflow.com/questions/6500524 / ...
brillout

Відповіді:


177

Що робити, якщо я хочу, щоб посилання завжди вказували на ГОЛОВНУ зовнішнього репо?

Ви можете зробити підмодуль слідувати за ГОЛОВОЮ гілки віддаленого репо-підмодуля, використовуючи:

о git submodule add -b <branch> <repository> [<path>]. (щоб вказати гілку, яку слід слідувати)
o, git submodule update --remoteяка буде оновити вміст підмодулю до останньої HEAD з <repository>/<branch>, за замовчуванням origin/master. Ваш головний проект все ще буде відслідковувати хеші HEAD підмодуля, навіть якщо --remoteвін використовується.



Ваша відповідь, здається, суперечить проголосованій відповіді тут: stackoverflow.com/questions/10443627/…
Натан Н

@NathanH це (можливість відстежувати HEAD) було додано через рік (березень 2013, git 1.8.2: github.com/git/git/blob/… )
VonC

Я бачу, що поведінка субмодулю також згадується у вашому іншому анверрі . У цьому випадку, я думаю, ви хочете сказати, що завжди вказівка ​​на HEAD підмодуля здійснюється за допомогою використання обох add -bі --remoteдалі в командах оновлення відповідно до документації на оновлення підмодуля . У такому випадку, чи -bдійсно все ж потрібно для слідування ГОЛОВІ майстра?
matanster

@matt the -bвикористовується для створення правильних метаданих .gitmodule для підмодуля (це еквівалентно a git config -f .gitmodules submodule.<path>.branch <branch>).
VonC

Тоді це мало спільного з включенням --remote- --remoteпрацює також, якщо -bвін не використовувався add. В обох випадках оновлення призведе до виникнення комітету в батьківському репо-сховищі підмодуля, тому посилання насправді "не завжди вказують на ГОЛОВУ" дуже автоматичним способом .... або я цього не отримав, або ця претензія краще зняти з оригінальної відповіді (?)
matanster


121

Концептуальна різниця:

За допомогою підмодулів git ти зазвичай хочеш розділити великий сховище на менші. Спосіб посилання на підмодуль є стилем Maven - ви посилаєтесь на один комітет з іншого (підмодуля) сховища. Якщо вам потрібна зміна в підмодулі, вам слід зробити фіксування / натискання всередині підмодуля, потім посилайтеся на новий комітет у головному сховищі, а потім здійснюйте / натискайте на змінену посилання основного сховища. Таким чином, ви повинні мати доступ до обох сховищ для повної збірки.

За допомогою піддерева git ви інтегруєте інше сховище у своє, включаючи його історію. Тож після його інтеграції розмір вашого сховища, ймовірно, більший (тому це не стратегія для зменшення сховищ). Після інтеграції немає з'єднання з іншим сховищем, і вам не потрібен доступ до нього, якщо ви не хочете отримати оновлення. Тож ця стратегія скоріше для повторного використання коду та історії - я особисто не використовую її.


Але з git subtreeвами все одно також можна підштовхнути - якщо хотіли - так?
Ixx

@lxx Якщо вам відома URL-адреса сховища…
Франклін Юй

@FranklinYu Чому він би цього не знав? не можете отримати цю інформацію з локальних метаданих git?
adi518

@ adi518 Так, якщо ви є тим, хто створив піддерево. Однак якщо ви пересунули ваш сховище до GitHub, а інші його клонували, я не думаю, що він / вона автоматично знає URL-адресу піддерева.
Франклін Ю.

@NiklasP - чи можете ви детальніше розповісти про "посилання на новий комітет у головному сховищі"? Це єдиний крок, який мені не зрозуміло, як виконати, і тому "змінена посилання" - це теж не те, що я розумію.
Роберт Ошлер

21

підмодуль,
натиснувши основне репо на віддалений, не натискає файли підмодуля

суб-дерево, що
відсилає основне репо до віддаленого, висуває файли під-дерева


3
"натискання основного репо на віддалене поштовхує файли під-дерева" Ні, це не так.
Дж. Брамбл

@JBramble Я, мабуть, мушу зазначити, що це робиться за допомогою програми SourceTree, наприклад:git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags production refs/heads/master:refs/heads/master
Maciek Rek
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.