Извлечение поддерева с использованием ветвления
Я использую git-subtree
извлечь каталог из моего проекта.
git subtree split --prefix=src/SubProject --branch=SubProject origin/master
Учитывая то, как я хотел бы начать проект для начала (конкретно нет --rejoin
) как можно разделить только изменения от origin/master
в SubProject
на последовательных пробегах?
Для небольших проектов это работало нормально. Я могу жить с ~5 секунд, чтобы разделить проект. Но на больших репозиториях это может занять довольно много времени. Я видел, что это занимает до пяти минут на разделение. Некоторые из проектов, с которыми я хотел бы работать, содержат более 45 подпроектов в одном хранилище.
Я перепробовал много вещей, которые, как мне показалось, могли бы сработать, но каждая потерпела неудачу так или иначе Мои требования:
- Не должен связываться с
origin/master
любым способом (так по большей части--rejoin
не может быть и речи) - Он не должен добавлять дополнительные коммиты слияния (подумайте:
--ff-only
при получении новых изменений отorigin/master
) -
SubProject
репозиторий должен иметь стабильные идентификаторы коммитов. Это означает, что после одного или нескольких дополнительных обновленийSubProject
, он должен иметь те же идентификаторы фиксации в своей истории, которые он получит, если я перезапущу оригинальную команду в верхней части этого поста. - Это должно быть автоматизировано и не требует ручного вмешательства
Я не боюсь сложного решения, но оно должно быть автоматизировано. Отказ из-за изменения истории - это нормально; в этот момент сценарий может вернуться к созданию всей вещи с нуля. В этом случае пользователь знает, что он сделал, поэтому он проходит через очень долгий процесс восстановления с нуля.:)
--rejoin
Я пытался с помощью --rejoin
и сохраняя дополнительную копию origin/master
вокруг, чтобы просто быть контейнером для измененной истории, добавленной --rejoin
, Проблема, с которой я столкнулся, заключалась в том, что я не мог ни git rebase origin/master
или же git merge --ff-only origin/master
без вмешательства. Я должен быть в состоянии сделать это автоматически, чтобы это было неприемлемо.
слияние совершает
Я смог заставить его работать так, как я хотел с git merge origin/master
но это привело к фиксации слияния. Поскольку этот коммит слияния никогда не пойдет вверх по течению, история, которую я думаю, было бы невозможно предсказать столь свежим git subtree split
в нетронутой среде невозможно воспроизвести точно такую же историю. Я могу ошибаться в этом. Если так, пожалуйста, объясните мне, как это будет безопасно. :)
диапазоны фиксации
Я экспериментировал с использованием диапазона фиксации, и мне удалось создать новое разбиение поддерева в SubProject
который содержит только список коммитов с определенного момента времени до HEAD
, Это, вероятно, сработает, за исключением того, что выглядит так, как будто он генерирует новый набор идентификаторов фиксации, поэтому я не думаю, что это будет вариант.
1 ответ
Реализован патч для subtree split
чтобы упростить игру с этим. Теперь вы можете явно указать родителя, который заполняется, когда нет других родителей:
$ git init
$ for i in {1..100}; do
echo $i >q
git add q
git commit -m $i
mkdir -p qqq
echo $i > qqq/w
git add qqq/w
git commit -m "qqq/$i"
done
$ # let's do full split
$ /home/vi/src/git/git/contrib/subtree/git-subtree.sh split \
--prefix=qqq --branch qqq HEAD
...7/200 (6)...58/200 (57)...142/200 (141)...176/200 (175)...
Created branch 'qqq'
f5120d3e676e2966802c8829b13a34c8d0c2dac4
$ # now let's do partial split
$ /home/vi/src/git/git/contrib/subtree/git-subtree.sh split \
--prefix=qqq --branch qqq2 HEAD~100
...20/100 (19)...
Created branch 'qqq2'
3632fb9fc5c7a7f0b4bf8c6743e2cd372a6d8e52
$ # Now let's "continue the work" on qqq2
$ /home/vi/src/git/git/contrib/subtree/git-subtree.sh split \
--prefix=qqq --branch qqq2 \
--graft-parent=3632fb9fc5c7a7f0b4bf8c6743e2cd372a6d8e52 \
HEAD~100..HEAD
Grafting 3632fb9fc5c7a7f0b4bf8c6743e2cd372a6d8e52\n
...10/100 (9)...
Updated branch 'qqq2'
f5120d3e676e2966802c8829b13a34c8d0c2dac4