Для того, чтобы ввести в main
все соответствующие изменения, которые произошли в external
две вещи должны произойти:
- Изолировать оригинальный
main
- Привести в
main
все это совершает, которые произошли в external
Для первого, Изолировать оригинал main
:
похоже, что у вас, вероятно, есть main
в своем собственном репозитории.
Если не удалось извлечь из external
хранилища до тех пор, как оригинальные main
фиксаций, где установлен в качестве родителя коммита, который создал подкаталог external/main
. Примером такого является процесс, описанный в Git Book Subtree Merging page.
Заключается, где введенное поддерево может быть найдено, как описано in this answer.
И тогда это всего лишь вопрос захвата всего набора коммитов, которые являются базой main
и делают из него репозиторий.
Для второго, Привести в main
это все коммиты, которые произошли в external
:
Вы уже выделили коммиты, которые содержат изменения в exteral/main
вложенной, но, как вы утверждаете, он не включает в себя оригинал main
совершает.
git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter main -- --all
Это потому, что filter-branch
будет проверять только файлы в определенном месте подкаталоге, не зная, как справиться с более сложными операциями, как read-tree
, который создал подкаталог.
После операции filter-branch
вы останетесь с набором коммитов, которые содержат все изменения, которые произошли в main/external
. Предположим, что этот набор коммитов может быть достигнут в ветке filteredMain
.
Поскольку содержимое было перемещено из подкаталога в корень, то расположение файлов теперь будет таким же, как и в содержимом в репозитории main
. Это позволит объединить оба дерева. Поскольку эти два дерева, главная ветка main
и filterBranch
не имеют истории, к ней могут присоединяться rebase
, воспроизводящие изменения коммитов.
# in the main repository
# bring the external repository and get the branch
git remote add external /path/to/external
git fetch external filteredMain
git checkout filteredMain
# We need the first commit of this tree for the rebase command
firstCommit=$(git rev-list --max-parents=0 HEAD)
# run the rebase
git rebase --onto master $firstCommit filteredMain
После этого filteredMain
ветвь должна содержать все изменения, которые произошли в external/main
переигран на вершине оригинальной master
ветви в main
хранилище.
Как «ZZZ» слился с «AAA»? – LopSae
Вы также можете использовать имена, которые передают немного смысла и помогают читабельности вопроса, например 'main' и' external' для репозиториев. – LopSae
С помощью обычного механизма: путем извлечения репо в 'external', а затем с помощью' read-tree', чтобы поместить его в каталог 'external' repo. – bwoebi