Как я могу получить связанный с подкомпоном идентификатор комманды 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

проверить все записи дерева идентификатора или зафиксировать идентификатор.