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"