Где я могу увидеть запись 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.





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" в вашем примере - это просто каталог, а не подмодуль, у него не будет собственной записи индекса (потому что поддержание этого идентификатора в актуальном состоянии было бы одним из ненужные накладные расходы, которых индекс существует, чтобы избежать).
Рассмотрим вывод git ls-tree -rd: 160000 commit 139dedcb98fca8fb69d70305709783ff40316cd4 vim/pack/bundle/start/tabulous. Является ли «фиксация» синонимом «подмодуля»? Т.е. git знает, что идентификатор объекта относится к подмодулю, из-за его типа «фиксация» (или «фиксация» может означать другие вещи, которые «подмодуль»?)
Неважно, как вы это называете или используете ли вы помощники git submodule. Что это за запись, так это идентификатор фиксации. Вот что означает «gitlink»: запись, которая содержит идентификатор фиксации, а не идентификатор blob или вложенного дерева. Но это все еще идентификатор, который был записан для этого пути и добавлен в него. Это то, что должно быть, чтобы дерево работ соответствовало зафиксированному содержимому.
Спасибо. Разве в документации не ошибочно сказано запись gitlink в дереве на
path/to/bar? Ваше объяснение gitlink отличается от этого.