Я ищу ситуацию, в которой у меня есть структура git с (возможно, вложенными подмодулями). Для каждого из этих подмодулей я хочу отдельно указать, следует ли отслеживать ветвь (см., например, Git подмодули: укажите ветку/тег)
Например, мой проект может выглядеть так:
main.tex
|- submod1 @ master
| |-subsubmod1 @qsdf123
|- submod2 @ master
| |-subsubmod2 @shasha12
|- submod3 @ qsdf321
Теперь я хочу, чтобы обновить мои подмодули.
git submodule update --recursive
обновит все подмодули до их последнего записанного ша (т.е. будет работать для subsubmod1, subsubmod2 и submod3, но для остальных будет делать неправильные вещи. С другой стороны,
git submodule update --recursive --remote
обновит все подмодули в связанной ветки (по умолчанию, мастер), т.е. будет работать для подмоду1 и подмод2, но для остальных делать не так.
Есть ли способ сделать это красиво?
В ответ на первый ответ я уточню, что я подразумеваю под "делать неправильные вещи".
Вот небольшой пример
[email protected] ~/Desktop/test $ git init
Initialized empty Git repository in /home/bartb/Desktop/test/.git/
[email protected] ~/Desktop/test $ git submodule add ../remote/ submod1
Cloning into 'submod1'...
done.
[email protected] ~/Desktop/test $ git submodule add ../remote/ submod2
Cloning into 'submod2'...
done.
[email protected] ~/Desktop/test $ cd submod1
[email protected] ~/Desktop/test/submod1 $ git log
commit 42d476962fc4e25c64ff2a807d2bf9b3e2ea31f8
Author: Bart Bogaerts <[email protected]>
Date: Tue Jun 21 08:56:05 2016 +0300
init commit
commit db1ba3bc4b02df4677f1197dc137ff36ddfeeb5f
Author: Bart Bogaerts <[email protected]>
Date: Tue Jun 21 08:55:52 2016 +0300
init commit
[email protected] ~/Desktop/test/submod1 $ git checkout db1ba3bc4b02df4677f1197dc137ff36ddfeeb5f
Note: checking out 'db1ba3bc4b02df4677f1197dc137ff36ddfeeb5f'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch-name>
HEAD is now at db1ba3b... init commit
[email protected] ~/Desktop/test/submod1 $ cd ..
[email protected] ~/Desktop/test $ git config -f .gitmodules submodule.submod2.branch master
[email protected] ~/Desktop/test $ git commit -a -m "modules"
[master (root-commit) ea9e55f] modules
3 files changed, 9 insertions(+)
create mode 100644 .gitmodules
create mode 160000 submod1
create mode 160000 submod2
[email protected] ~/Desktop/test $ git status
On branch master
nothing to commit, working directory clean
[email protected] ~/Desktop/test $ git submodule update --recursive --remote
Submodule path 'submod1': checked out '42d476962fc4e25c64ff2a807d2bf9b3e2ea31f8'
[email protected] ~/Desktop/test $ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: submod1 (new commits)
Как вы можете видеть, после того, как последний git submodule update --remote
подмод1 выгрузился у мастера, хотя я никогда не настраивал для него основную ветку. Это то, что я подразумеваю под "делать неправильный материал"
То же самое происходит и для подподмодулей: все они проверяются у мастера, а не по их конкретному фиксации.
Эта "проблема" на самом деле является ожидаемой git submodule update --remote
. Из документации git:
This option is only valid for the update command. Instead of using the superproject’s recorded SHA-1 to update the submodule, use the status of the submodule’s remote-tracking branch. The remote used is branch’s remote (branch.<name>.remote), defaulting to origin. The remote branch used defaults to master, but the branch name may be overridden by setting the submodule.<name>.branch option in either .gitmodules or .git/config (with .git/config taking precedence).
https://git-scm.com/docs/git-submodule
В частности, часть:
The remote branch used defaults to master
Это то, чего я хочу избежать.
Изменить: дополнительный запрос: я не хочу вносить какие-либо изменения в подмодули или поднаборы (это совлокальные проекты).