Git стратегия слияния поддеревьев, возможно без истории слияния? - PullRequest
4 голосов
/ 18 сентября 2010

Я пытался отойти от подмодулей, чтобы получить автономный репозиторий, и стратегия слияния поддерева , похоже, соответствует этому варианту использования.

Однакоистории слитых репозиториев появляются в истории моего собственного проекта, что довольно раздражает.

Я пробовал git filter-branch --subdirectory-filter path/to/subtree/ HEAD, что работает ... пока я не попытаюсь обновить поддерево с помощью git pull -s subtree my-subtree master, которое переписывает все поддеревофайлы в корень моего проекта.

Есть ли способ добиться этого в git?

Ответы [ 2 ]

8 голосов
/ 18 сентября 2010

apenwarr 's поддерево git имеет опцию --squash, которая может сделать почти то, что вы хотите.

remote=libfoo
branch=master
prefix=helpers/libfoo

git fetch "$remote" &&
git subtree add --prefix="$prefix" --squash "$remote/$branch"

: Later, once there are changes to pick up.
git subtree pull --prefix="$prefix" --squash "$remote" "$branch"

git subtree записывает дополнительную информацию в сообщения о коммитах коммитов, которые он генерирует; эта дополнительная информация позволяет ему эффективно выполнять слияния, не включая фактическую историю сливаемого поддерева.


Если вы знаете, что никогда не будете вносить какие-либо изменения в поддерево в «супер» хранилище (т. Е. Все изменения в поддереве всегда будут происходить из какого-то другого хранилища), то вы можете обойтись без git subtree и просто повторите git read-tree --prefix= часть метода слияния поддерева (хотя сначала вы должны очистить ваше текущее поддерево от обоих индексов).

remote=libfoo
branch=master
prefix=helpers/libfoo/

: replace the local subtree with whatever the other repository has
git fetch "$remote" &&
git rm -r --ignore-unmatch "$prefix" &&
git read-tree --prefix="$prefix" "${remote}/${branch}" &&
git checkout -- "$prefix" &&
git commit -m "update $prefix from $remote $branch"
0 голосов
/ 20 декабря 2010

Если это просто раздражение при чтении «git log», то вы можете попробовать:

git log --first-parent

Он показывает только ваши коммиты и (одиночные) коммиты слияния, но не коммитыудаленный.

Если вы хотите увидеть его с помощью различий (который создаст один большой разност для коммитов слияния):

git log -p -m --first-parent

Никаких дополнительных инструментов не требуется:)

...