Из вашего текстового описания я думаю , что вы хотели сказать, это то, что у вас есть один репозиторий с двумя независимыми (непересекающимися, чтобы быть техническими) подграфами коммитов внутри них.Вот, например, диаграмма такого хранилища:
C--D
/ \
A--B G--H <-- branch1
\ /
E--F <-- branch2
I--J--K--L <-- master
\
M--N <-- develop
Этот конкретный граф имеет четыре "точки входа", а именно фиксирует F
и H
в подграфе с корнем в A
икоммиты L
и N
в подграфе с корнем в I
.
Хотя в таком репозитории нет ничего принципиально неправильного или нарушенного, его относительно легко разделить на два отдельных репозитория.Просто начните с двух клонов, оба из которых выглядят так.(Вы можете использовать git clone --mirror
для создания зеркальных клонов, которые сохраняют все ссылки. Обязательно сотрите их origin
s, чтобы они оба не указывали на исходный объединенный репозиторий.)
В одном такомклонировать, удалить любые внешние метки - имена ветвей, имена тегов и другие ссылки, если существуют какие-либо другие ссылки, - на любой из коммитов в один из двух подграфов:
C--D
/ \
A--B G--H <-- branch1
\ /
E--F <-- branch2
I--J--K--L [abandoned]
\
M--N [abandoned]
Beобязательно включите любые теги или другие имена, которые указывают на намеренно оставленный подграф.Обычные команды просмотра графиков, такие как git log
, не будут отображать неподписанный подграф: появится , который будет удален, хотя он все еще будет присутствовать физически.В конце концов, несвязанный подграф отпадет, или вы можете удалить его быстрее, используя git gc
.Клоны, сделанные из , в этом хранилище не будет ссылочного подграфа.
В другом из двух клонов удалите все ссылки на другой подграф:
C--D
/ \
A--B G--H [abandoned]
\ /
E--F [abandoned]
I--J--K--L <-- master
\
M--N <-- develop
Как и раньше, ссылочный подграф в конечном итоге исчезнет.
Обратите внимание, что любые клоны исходного хранилища с двумя независимыми подграфами могут использоваться для git push
до либо этих разделенных клонов.В этом отношении любой третий, полностью независимый репозиторий может также использоваться для передачи в любой из этих двух клонов.Любой толчок, который добавляет имя для коммита, который находится в независимом подграфе, заставит весь независимый подграф войти в получателя толчка. Как вы предполагаете в комментарии , я подозреваю, что именно так возникла эта ситуация.
Вы можете добавить ловушку предварительного получения, которая отклоняет новые имена, которые добавляют новый корневой коммит,хотя нет никаких удобных приемных крючков этой формы, о которых я знаю.Это легко сделать, но медленно: запустите git rev-list --all --max-parents=0 --count
для подсчета существующих корней и секунду git rev-list --all --max-parents=0 --count <hash>
для подсчета корней, которые вы бы получили, если бы приняли предложенное сопоставление имени с хеш-идентификатором из git push
.Если число увеличивается, новый толчок добавляет новый корень.
Обратите внимание, что можно добавить новый корень, который является не частью непересекающегося подграфа.Например, рассмотрим графики «до и после»:
before:
A--B--C <-- master
after:
A--B--C--F--G <-- master
/
D--E
Этот вид перехвата предварительного получения отклонит такой толчок.Это может быть то, что вы хотите, но это не так;будьте осторожны в том, что вы программируете.: -)