Самый простой способ получить поведение типа svncopy --pin-externals с подмодулями Git - PullRequest
0 голосов
/ 24 апреля 2019

В настоящее время мой проект использует подмодули Git detached HEAD. В контексте обычного рабочего процесса разработки было бы гораздо удобнее указывать субмодули на подсказки соответствующих удаленных ветвей (git submodule add -b master ...), чтобы самые свежие изменения в подмодулях учитывались автоматически. Но когда дело доходит до создания тегов, которые должны оставаться постоянными с течением времени, ссылки субмодуля должны быть зафиксированы на тех конкретных коммитах, которые используются при создании тега.

В SVN это исправление может быть достигнуто простым добавлением аргумента --pin-externals в команду создания тега, но похоже, что Git не имеет прямого эквивалента для него. Какая моя лучшая ставка здесь?

1 Ответ

1 голос
/ 24 апреля 2019

TL; DR: тут нечего делать. Все суперпроектные коммиты всегда направляют все на отдельные заголовки. -b s не используются ни при фиксации, ни при git add ing, только при git submodule update --remote ing, и даже тогда вы все еще находитесь на отдельном HEAD, просто на другом.


В Git подмодули - это просто отдельные репозитории Git. Фиксация суперпроекта всегда записывает один конкретный хеш, к которому будет принудительно применен каждый подмодуль. Так, например, если вы сделали коммит суперпроекта с хешем a123456, например, a123456 уже пинов каждого субмодуля суперпроекта: подмодуль sub/A фиксирован навсегда (для этого commit), скажем, на aaaaaaaa, а подмодуль moduleB фиксируется навсегда (для этого коммита) на bbbbbbb. Когда вы вернетесь к фиксации a123456 в суперпроекте и запустите git submodule update, sub/A будет отсоединен от sub/A aaaaaaaa, а moduleB отсоединен от bbbbbbb.

Чтобы отсоединить подмодули, вы должны cd sub/A; git checkout master и cd moduleB; git checkout master. Вы можете полуавтоматизировать это, используя git submodule update --remote, который использует записанную ветвь, но на самом деле это не переключение sub/A на (его) master, а, скорее, чтобы выяснить, что sub/A ' remote s origin/master по идентификатору хэша и переключите sub/A на этот коммит в качестве отдельного HEAD. Таким образом, sub/A будет продолжать работать в режиме HEAD.

Использование git add в суперпроекте просто берет текущий HEAD (обычно отсоединенный, но даже если нет, фактический хеш-идентификатор, сообщаемый git rev-parse) из каждого подмодуля и записывает его в индекс суперпроекта, так что один идентификатор хэша будет в следующем коммите суперпроекта. Название ветки в подмодуле здесь не очень важно. Единственное использование этих -b master s в git submodule add предназначено для git submodule update --remote, и даже в этом случае субмодуль не должен находиться в ветви , это просто для автоматического обновления detached-HEAD подмодуля .

...