Где находится запись gitlink для подмодулей Git?

Где я могу увидеть запись gitlink, упомянутую в gitsubmodules(7)?

Для подмодуля с рабочим каталогом на path/to/bar/ запись gitlink должна располагаться на /path/to/bar и содержать хэш SHA-1 коммита подмодуля?

$ git submodule status
 139dedcb98fca8fb69d70305709783ff40316cd4 tabulous (0.5.0-2-g139dedc)
 24afe922e6a05891756ecf331f39a1f6743d3d5a vim-repeat (v1.2-9-g24afe92)
 f51a26d3710629d031806305b6c8727189cd1935 vim-surround (v2.1-18-gf51a26d)
$ ls -la tabulous/
total 72
drwxr-xr-x  8 nlykkei  staff   256B Apr  5 17:25 ./
drwxr-xr-x  5 nlykkei  staff   160B Apr  4 12:00 ../
-rw-r--r--  1 nlykkei  staff    67B Apr  4 12:00 .git
-rw-r--r--  1 nlykkei  staff    21B Apr  4 12:00 .gitignore
-rw-r--r--  1 nlykkei  staff    18K Apr  4 12:00 LICENSE
-rw-r--r--  1 nlykkei  staff   5.0K Apr  5 17:25 README.md
drwxr-xr-x  4 nlykkei  staff   128B Apr  5 17:25 doc/
drwxr-xr-x  3 nlykkei  staff    96B Apr  5 17:25 plugin/
$ cat tabulous/.git
gitdir: ../../../../../.git/modules/vim/pack/bundle/start/tabulous

man 7 gitsubmodules:

   ...
   Assuming the submodule has a Git directory at $GIT_DIR/modules/foo/ and a working directory at path/to/bar/, the superproject tracks the submodule via a gitlink entry in
   the tree at path/to/bar and an entry in its .gitmodules file (see gitmodules(5)) of the form submodule.foo.path = path/to/bar.

   The gitlink entry contains the object name of the commit that the superproject expects the submodule's working directory to be at.
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
29
1

Ответы 1

Git записывает идентификатор фиксации для добавленного содержимого подмодуля так же, как он записывает идентификатор большого двоичного объекта для добавленного содержимого файла, в виде идентификатора, указанного в индексе или записанном дереве. Это gitlink: ваш контент находится в другом коммите, который вы можете проверить по этому пути, если хотите. Вспомогательная команда git submodule помогает вам выследить и разобраться с репозиторием, в котором есть этот коммит, но это не более чем помощники, набор произвольных имен для удобных маленьких строк от одного до пяти, которые в противном случае вы бы написали сами.

git rev-parse @:tabulous      # HEAD commit entry: "the current checkout had this here"
git rev-parse :tabulous       # index entry, "last thing added or checked out here"

git -C tabulous rev-parse HEAD   # what's actually checked out here

и вы, конечно, можете выполнить любую из дальнейших проверок в обычном режиме, версия низкого уровня для отслеживаемого контента

git -C tabulous diff-index --quiet --cached @ || echo staged changes in tabulous
git -C tabulous diff-files -q                 || echo unstaged changes in tabulous

Я не знаю быстрой проверки "любой неотслеживаемый контент" с помощью одной команды, я думаю, вам все еще нужны ls-файлы и некоторые строительные леса для этого, например

stdbuf -oL git -C tabulous git ls-files --exclude-standard -o  | grep -q . \
&& echo untracked, unignored files in tabulous

stdbuf -oL git -C tabulous git ls-files --exclude-standard -oi | grep -q . \
&& echo untracked, ignored files in tabulous

(часть stdbuf -oL имеет значение только в Really Big Work Trees, где стоит нажимать клавиши, чтобы не пройти достаточно, чтобы найти целый буфер, полный имен)

Обратите внимание, что отдельные каталоги существуют как объекты в объекте db, но не в индексе, запись новых каждый раз, когда что-либо в них содержит изменения, является одной из вещей, для которых существует индекс, чтобы не разбрызгивать новые деревья при каждом изменении, но это может помочь чтобы помнить об этом, когда вы пишете скрипты: если "tabulous" в вашем примере - это просто каталог, а не подмодуль, у него не будет собственной записи индекса (потому что поддержание этого идентификатора в актуальном состоянии было бы одним из ненужные накладные расходы, которых индекс существует, чтобы избежать).

Спасибо. Разве в документации не ошибочно сказано запись gitlink в дереве на path/to/bar? Ваше объяснение gitlink отличается от этого.

Shuzheng 06.04.2021 10:07

Рассмотрим вывод git ls-tree -rd: 160000 commit 139dedcb98fca8fb69d70305709783ff40316cd4 vim/pack/bundle/start/tabulous. Является ли «фиксация» синонимом «подмодуля»? Т.е. git знает, что идентификатор объекта относится к подмодулю, из-за его типа «фиксация» (или «фиксация» может означать другие вещи, которые «подмодуль»?)

Shuzheng 06.04.2021 10:54

Неважно, как вы это называете или используете ли вы помощники git submodule. Что это за запись, так это идентификатор фиксации. Вот что означает «gitlink»: запись, которая содержит идентификатор фиксации, а не идентификатор blob или вложенного дерева. Но это все еще идентификатор, который был записан для этого пути и добавлен в него. Это то, что должно быть, чтобы дерево работ соответствовало зафиксированному содержимому.

jthill 06.04.2021 19:37

Другие вопросы по теме