Извлечение поддерева с использованием ветвления

Я использую 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
Другие вопросы по тегам