Git «зафиксировать все, кроме изменений подмодуля»

#git #git-submodules

#git #git-подмодули

Вопрос:

Мой обычный рабочий процесс git

 git checkout -b branch_name
.... <do my thing>
git commit -am 'some comment'
git fetch
git merge origin/develop
.... <do some more things>
git commit -am 'more things'
git push
  

К сожалению, в репозитории, над которым я работаю, есть подмодули (которые я никогда не изменяю, но другие делают). Если я выполню вышеуказанное и если слияние обновит подмодули, вторая фиксация приведет к использованию старой версии подмодулей, и в итоге я получу непреднамеренные изменения подмодулей в моем запросе на извлечение.

Я знаю, что могу просто сделать git submodule update --init --recursive после слияния. Но это довольно легко забыть, и я не всегда хочу это делать (например, когда просто переходишь к другой ветке, чтобы что-то изменить, и возвращаешься назад)

Мой вопрос

Есть ли какая-либо альтернатива git commit -am 'blahblah' , которая фиксирует все вне подмодулей?

Я понимаю, что мне придется обновить их, чтобы мой код работал должным образом. Но я просто не хочу иметь проблемы с их случайной фиксацией.

Я также хотел бы избежать автоматического обновления их при слиянии / переключении ветвей — поскольку это замедляет и усложняет переключение.

Ответ №1:

Итак, вы хотите перенести устаревшие проверки подмодуля, но добавить все остальное? У Git нет опции фиксации из одной буквы, чтобы просто сделать это, но это достаточно просто для написания сценария,

 git ls-files -s $(git ls-files -m) | grep -v ^16 | cut -f2-
  

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

Итак

 git commit -m blahblah $(
        git ls-files -s $(git ls-files -m) | grep -v ^16 | cut -f2-
)
  

это должно быть сделано так, как вам нравится.

Ответ №2:

Я знаю, что могу просто сделать git submodule update --init --recursive . Но это довольно легко забыть, и я не всегда хочу это делать (например, когда просто переходишь к другой ветке, чтобы что-то изменить, и возвращаешься назад)

Вы можете сделать это автоматически, создав перехват предварительной фиксации (скрипт, который запускается перед фиксацией).

Поскольку это выполняется только перед фиксацией, вам не нужно думать об этом, и этого не произойдет, если вы просто переключите ветки и т.д. Однако фиксация с помощью этого скрипта будет медленнее.

Чтобы сделать это, перейдите к hooks папке в вашем .git каталоге.

Там вы создаете файл с именем pre-commit со следующим содержимым:

 #!/bin/bash
git submodule update --init --recursive
  

Это автоматически обновляет все подмодули в этом репозитории перед фиксацией.

Этот скрипт должен работать в Linux и Windows, поскольку git для Windows поставляется с bash. Если это не сработает, вы можете попробовать указать использовать полный путь к cmd / git bash вместо /bin/bash . Я думаю, что также может быть быстрее использовать cmd в Windows.

Если вы хотите зафиксировать без обновления подмодулей, вы можете добавить --no-verify в git commit команду.

Подробнее см. эту главу в Git Pro.