Как я могу получить связанный идентификатор коммита подмодуля из предыдущего коммита в родительском клоне?
Есть ли способ, кроме фактической проверки родительского коммита, определить идентификатор коммита SHA-1 подмодуля на основе идентификатора коммита в родительском клоне? Я знаю, что могу найти связанный с SHA-1 с помощью 'git submodule'.
Вот пример: у меня есть клон с одним подмодулем 'foo', который несколько раз менялся за последний месяц. У меня есть тег родительского клона, которому несколько недель, называется "release-1.2.3". Я хочу выяснить, что связывало SHA-1 из 'foo' для этого тега. Я мог бы просто проверить 'release-1.2.3' и использовать git-submodule для просмотра, но мне интересно, есть ли способ сделать это, не затрагивая рабочее дерево, так как я хочу написать его.
Я хочу сделать это, потому что я хочу создать скрипт, который будет выполнять 'diff' для всех изменений в подмодуле между двумя коммитами в родительском репозитории - то есть "скажите мне, какие файлы изменились в подмодуле 'foo' между этими двумя коммитами в родитель. "
4 ответа
Вы можете использовать git-ls-tree
чтобы увидеть, каким был идентификатор SHA-1 данного пути во время данного коммита:
$ git ls-tree released-1.2.3 foo
160000 commit c0f065504bb0e8cfa2b107e975bb9dc5a34b0398 foo
(Моя первая мысль была git show released-1.2.3 foo
, но это не с "роковой: плохой объект".)
Поскольку вы создаете сценарий для выходных данных, вы, вероятно, захотите получить только идентификатор SHA-1, например:
$ git ls-tree released-1.2.3 foo | awk '{print $3}'
c0f065504bb0e8cfa2b107e975bb9dc5a34b0398
Также: при написании скриптов вокруг git, старайтесь придерживаться сантехнических команд, как описано в руководстве. У них более стабильный интерфейс, в то время как более привычные "фарфоровые" команды могут изменяться несовместимыми способами.
Этот работал для меня:
$ git rev-parse released-1.2.3^{commit}:foo
<SHA1>
Возможно, также довольно прост в использовании в сценарии.
Я нашел один многообещающий проспект:
$ git log --raw <since>..<until> --submodule -- <path/to/submodule>
С опцией --raw это выводит (сокращенно) идентификаторы SHA-1, соответствующие связанным коммитам субмодуля. К сожалению, результат очень многословен и потребует некоторой работы для обработки в скрипте.
Что мне действительно нужно, так это средство git, которое, учитывая идентификатор родительского коммита, дает мне последние изменения в подмодуле до этого коммита. Т.е. какой подмодуль SHA-1 "git submodule update" проверил бы, если бы я на самом деле извлек эту родительскую фиксацию.
git
ls-tree
сделаю работу. Но иногда вы должны назвать это несколько раз или использовать -r
показывать подстроки рекурсивно.
├─project
│ └─submodules
│ ├─submodule_a
│ ├─submodule_b
│ ├─...
Например, если у вас есть такой каталог проекта, и вы хотите зафиксировать идентификатор submodule_a
с именем тега в родительском модуле.
git ls-tree v5.4.0
даст вам идентификатор дерева каталога submodules
, а не коммит id. Это выглядит следующим образом.
040000 tree e542bc1b084a0394ff16452c27df6572366e0009 submodules
Просто кормить ls-tree
с идентификатором дерева, и вы получите фактический идентификатор фиксации каждого подмодуля.
git ls-tree e542bc
Вы получите что-то вроде этого.
160000 commit 0f253bf94e0345600cb7a234a24eeec8ee3533bd submodule_a
160000 commit 0edcbaf94e034987cb4eeec8ee3533bd12349ade submodule_b
Или просто использовать
git ls-tree v5.4.0 -r
проверить все записи дерева идентификатора или зафиксировать идентификатор.
Мерзавец раб (мерзавцы) может быть вашим ответом.
http://gitslave.sourceforge.net/
Но вы также можете сделать это с простым мерзавцем.. это не так просто.