Включить другую ветку в качестве подкаталога?
Я пытаюсь создать такую ветку branchA
имеет подпапки A
а также B
, но B
содержит содержимое branchB
,
Я смотрел на submodules
, subtrees
, а также subrepos
, но я не могу понять, что будет делать то, что я ищу.
Чтобы это не превратилось в проблему XY, моя общая ситуация такова: я занимаюсь разработкой игры на HTML5/JS и хочу протестировать ее на страницах Github.
Поэтому я хочу, чтобы филиал / подкаталог gh-pages/play
содержать ветку master
,
1 ответ
Филиалы не имеют папок / каталогов. Ветви - это просто указатели для фиксации хеш-идентификаторов (они начинаются как небольшие файлы, содержащие необработанный хеш-идентификатор, хотя их можно сжать в своего рода базу данных сопоставления имени с идентификатором, которую Git делает, чтобы сэкономить время и пространство для имен, которые не постоянно меняются). Так что это невозможно напрямую.
Тем не менее, вы можете делать то, что вы хотите с подмодулями. Это просто сложно. Вы должны быть очень осторожны. Мне также не совсем понятно, будет ли он вообще работать с какими-либо объектами GitHub Pages, так как они должны выполнять операцию clone-and-checkout-with-submodule.
Подмодуль Git - это просто еще один репозиторий Git: вы говорите Git, что какой-то каталог ("папка"), такой как B
должно быть сделано путем клонирования другого репозитория Git с определенного URL. Как только клон сделан, Git должен cd
в каталог, который git clone
делает, и git checkout
один конкретный коммит, по хеш-идентификатору.
Ну а что если для "другого" Git-репозитория вы хотите git://host.name/path/to/url.git
проверить в подкаталог B
Вы указываете URL git://host.name/path/to/url.git
?
Очевидная опасность здесь - это возможность бесконечной рекурсии: Git проверяет url.git
видит, что у него есть подмодуль, клоны url.git
в подкаталог B
, проверяет коммит внутри B
видит, что у него есть подмодуль, клонирует его, cd
с тем, что сейчас B/B
, видит, что у него есть подмодуль, клонирует его, переходит в B/B/B
видит, что у него есть подмодуль...
Вы избегаете этой бесконечной рекурсии:
- клонирование без рекурсивного извлечения подмодулей (это значение по умолчанию для
git clone
) и / или - убедившись, что в конкретном коммите для подмодуля не было конкретного коммита, подмодуль которого содержит подмодуль.
Есть еще одна проблема: подмодули проверяют один конкретный коммит по хеш-идентификатору, а не по имени ветки. Вы хотели B
быть клоном, который проверяет ветку master
(который, по-видимому, никогда не имеет собственного субмодуля B
). Но все, что вы можете получить, это B
это проверяет определенный хэш-идентификатор Git, который является хеш-идентификатором, который вы сохранили в коммите в суперпроекте (который, конечно, является тем же хранилищем).
Есть несколько способов отменить подмодуль от его одно-специфического коммита, включая способы заставить его проверять ветку по имени-ветви. Это требует выполнения конкретных git submodule
команды, которые являются частью того, что может помешать вам делать это на страницах GitHub (что бы это ни было, опять же). Но, предполагая, что они вообще позволяют вам делать субмодуль, вам не обязательно указывать его по имени: вы можете просто сделать новый коммит, который сохранит новый master
хеш в суперпроект.
Скажем, например, вы находитесь на ветке develop
в этом суперпроекте с самим собой как подмодуль. В develop
, есть .gitmodules
файл с надписью "У меня есть субмодуль / подпроект, который вы должны клонировать в B
, используя этот URL-адрес здесь (который является URL-адресом суперпроекта). На коммите tip of Develop у вас есть коммит, содержащий запись дерева "gitlink", которая говорит "сделать клон в B
, ища URL подпроекта в .gitmodules
и используя хеш deadb0a
"- что является хешем кончика коммита ветви master
,
Как только вы продвигаете кончик master
на новый коммит ac0ffee
, вы проверите develop
и сделать новый коммит, который имеет запись дерева gitlink, которая говорит "сделать клон в B
используя хэш ac0ffee
". Ничего другого не меняется - только хэш-идентификатор - но сейчас, когда кто-то проверяет develop
с включенными подмодулями, они получают тот же коммит в B
что они, проверив филиал master
в B
, потому что филиал master
говорит "проверить хеш ac0ffee
".
(Очевидно, что все это немного подвержено ошибкам, как и подмодули в целом. Я подозреваю, что это не очень мудрый путь, чтобы пойти вниз. Но в теории, по крайней мере, он может работать.)