Как я могу получить связанный с подкомпоном идентификатор комманды git от прошлой фиксации в родительском клоне?
Есть ли способ, кроме фактической проверки родительского коммита, для определения идентификатора коммита SHA-1 субмодуля на основе идентификатора коммита в родительском клоне? Я знаю, что могу найти связанный в данный момент SHA-1 с git submodule
.
Вот пример:
- У меня есть клон с одним подмодулем
foo
, который несколько раз менялся за последний месяц.
- У меня есть тег родительского клона, которому несколько недель, и который называется
released-1.2.3
. Я хочу выяснить, что было связано с SHA-1 из foo
для этого тега.
- Я мог бы просто проверить
released-1.2.3
и использовать git submodule
, чтобы посмотреть, но мне интересно, есть ли способ сделать это без воздействия на рабочее дерево, так как я хочу написать его.
Я хочу сделать это, потому что я хочу создать скрипт, который будет выполнять 'diff' для всех изменений в подмодуле между двумя коммитами в родительском репозитории - то есть "скажите мне, какие файлы изменились в подмодуле foo
между этими двумя коммитами в родитель."
Ответы
Ответ 1
Вы можете использовать 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 попробуйте придерживаться plumbing, как описано в руководстве. У них более стабильный интерфейс, в то время как более знакомые "фарфоровые" команды могут изменяться несовместимыми способами.
Ответ 2
Это работало для меня:
$ git rev-parse released-1.2.3^{commit}:foo
<SHA1>
Возможно, также довольно легко использовать в script.
Ответ 3
Я нашел один перспективный путь:
$ git log --raw <since>..<until> --submodule -- <path/to/submodule>
С опцией -raw это распечатает (сокращенные) идентификаторы SHA-1, соответствующие связанным с подмодулем коммитам. К сожалению, вывод очень подробный и потребует некоторой работы для обработки в script.
Мне действительно нужно средство git, которое, учитывая идентификатор фиксации родителя, дает мне последнее изменение в подмодуле до этого коммита. То есть какой подмодуль SHA-1 'git обновление подмодуля "будет проверять, действительно ли я должен проверить, что родительский фиксатор.
Ответ 4
git slave (gits) может быть вашим ответом.
http://gitslave.sourceforge.net/
Но вы также можете сделать это с помощью простого git.. это не так просто.
Ответ 5
git
ls-tree
сделает всю работу. Но иногда вы должны вызывать его несколько раз или использовать -r
для рекурсивного отображения подстатей.
├─project
│ └─submodules
│ ├─submodule_a
│ ├─submodule_b
│ ├─...
Например, если у вас есть такая директория проекта, и вам нужен идентификатор коммита submodule_a
с именем тега в родительском модуле.
git ls-tree v5.4.0
даст вам идентификатор дерева submodules
каталога, а не идентификатор фиксации. Это выглядит следующим образом.
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
проверить все записи дерева идентификатора или зафиксировать идентификатор.