Как я могу получить связанный идентификатор коммита подмодуля из предыдущего коммита в родительском клоне? - PullRequest
39 голосов
/ 21 октября 2010

Есть ли способ, кроме фактической проверки родительского коммита, определить идентификатор коммита SHA-1 субмодуля на основе идентификатора коммита в родительском клоне?Я знаю, что могу найти связанный с ним SHA-1 с помощью 'git submodule'.

Вот пример: у меня есть клон с одним подмодулем 'foo', который несколько раз менялся за последний месяц.У меня есть тег родительского клона, которому несколько недель, называется «release-1.2.3».Я хочу выяснить, что было связано с SHA-1 из 'foo' для этого тега.Я мог бы просто проверить 'release-1.2.3' и использовать git-submodule для просмотра, но мне интересно, есть ли способ сделать это, не затрагивая рабочее дерево, так как я хочу написать его.

Я хочу сделать это, потому что я хочу создать скрипт, который будет выполнять 'diff' для всех изменений в подмодуле между двумя коммитами в родительском репозитории - то есть "скажите, какие файлы изменились в подмодуле 'foo' между этими двумя коммитамив родительском. "

Ответы [ 5 ]

50 голосов
/ 25 октября 2010

Вы можете использовать git-ls-tree, чтобы увидеть, каким был идентификатор SHA-1 данного пути во время данного коммита:

$ git ls-tree released-1.2.3 foo
160000 commit c0f065504bb0e8cfa2b107e975bb9dc5a34b0398  foo

(Моя первая мысль была git show released-1.2.3 foo, но это не работает с «fatal: bad object».)

Поскольку вы создаете сценарий для выходных данных, вы, вероятно, захотите получить только идентификатор SHA-1, например:

$ git ls-tree released-1.2.3 foo | awk '{print $3}'
c0f065504bb0e8cfa2b107e975bb9dc5a34b0398

Также: при написании скриптов вокруг git, попробуйте придерживаться команд plumbing , как описано в руководстве.У них более стабильный интерфейс, в то время как более привычные «фарфоровые» команды могут изменяться несовместимыми способами.

6 голосов
/ 29 июня 2015

Этот работал для меня:

$ git rev-parse released-1.2.3^{commit}:foo
<SHA1>

Возможно, довольно легко использовать в скрипте.

2 голосов
/ 21 октября 2010

Я нашел один многообещающий проспект:

$ git log --raw <since>..<until> --submodule -- <path/to/submodule>

С опцией --raw это выдает (сокращенные) идентификаторы SHA-1, соответствующие связанным коммитам субмодуля.К сожалению, выходные данные очень многословны и потребуют некоторой работы для обработки в скрипте.

Что мне действительно нужно, так это средство git, которое, учитывая идентификатор родительского коммита, дает мне последние изменения в подмодуле до этогосовершить.То есть, какой подмодуль SHA-1 «git submodule update» проверил бы, если бы я действительно извлек эту родительскую фиксацию.

0 голосов
/ 09 мая 2019

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

для проверки всех идентификаторов дерева записей или идентификатора коммита.

0 голосов
/ 21 октября 2010

git slave (gits) может быть вашим ответом.

http://gitslave.sourceforge.net/

Но вы также можете сделать это с простым git ... это не так просто.

...