#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.