Как добавить и зафиксировать подмодуль в родительском проекте без сброса состояния других подмодулей? - PullRequest
1 голос
/ 10 января 2020

Я пытаюсь написать скрипт, который проверяет 'master' во всех подмодулях.

Обычно после клона все подмодули находятся в отключенном состоянии. Однако я хочу, чтобы они были на ветке. Так что мой скрипт посещает каждый подмодуль и при определенных условиях проверяет ветку.

Грубо говоря, это сводится к тому, что

git submodule foreach --recursive 'git checkout master'

После такой проверки я также пытаюсь перемотать их вперед , HEAD подмодуля (master) может больше не совпадать с записанным sha1 в родительском проекте. В этом случае сценарий также делает

git add path/to/submodule
git commit -m 'Automatic update of submodule'

в родительском элементе (сразу после 'git мастер проверки; git merge --ff-only' в подмодуле).

То есть ... это также зафиксировало бы все, что уже было добавлено в индекс, и я не хочу этого: я ТОЛЬКО хочу зафиксировать это "добавление" пути / к / подмодулю.

Я попытался решить эту проблему, обернув вышеуказанное в git sta sh push / pop:

git stash save Automatic stash of parent project by update_submodules.sh
git add "$path"
git commit -m "Updating submodule reference to current HEAD of branch $submodule_branch of $name"
git stash pop

Однако git stash снова переводит все подмодули в отключенное состояние! И git stash pop НЕ восстанавливает это: /

Как мне добиться того, что я хочу?

РЕДАКТИРОВАТЬ

Ответ Торека был использован в финале update_submodules.sh скрипт в строке 47 . Он должен называться вот так .

1 Ответ

2 голосов
/ 11 января 2020

Используйте в противном случае довольно специализированный git commit --only.

Что git commit --only делает:

  1. создает временный индекс 1 и читает существующий HEAD фиксируется в этом временном индексе, так что HEAD и этот временный индекс совпадают;
  2. git add указанные аргументы для временного индекса;
  3. делают фиксацию из результата;
  4. договорились, что регулярный индекс также имеет те git add -ed к моменту окончания git commit --only.

Итак, новый коммит - который теперь HEAD; коммит, который был HEAD, теперь HEAD~1 или HEAD^ (какой бы синтаксис вы ни предпочли: оба означают одно и то же) - точно такой же, как старый , за исключением для файлов, перечисленных после --only. Если какой-то материал был поставлен, тот же самый материал все еще поставлен. Между тем (основной) индекс теперь также обновляется, чтобы учесть тот факт, что в коммите HEAD есть новые версии указанных файлов.

(В этом случае «файлы» - это просто ссылки или одна ссылка для одного субмодуля.)


1 Фактически создает два временных индекса файла. Для полных и кровавых подробностей, см. Мой ответ на Вызов git в pre-commit hook .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...