最简单的可能是让谁托管 repo 标签并提交您想要的特定树。例如,
在上游:
git tag quickie $(git commit-tree $(git rev-parse HEAD:path/to/dir) </dev/null)
你:
git fetch upstream quickie
如果您希望上游 repo 自动跟踪分支上的子树,您可以执行以下操作(适当的解密版本):
sed -n 's,^[^ ]* [^ ]* refs/heads/master$,git update-ref refs/heads/master-subtree -m "Auto-tracking master" $(git commit-tree master:subtree -m "Auto-tracking master subtree" $(test -r refs/heads/master-subtree \&\& echo -p refs/heads/master-subtree)),p' | sh -x
这比看起来简单。试试这个:
mkdir ~/tryitout && cd ~/tryitout && git init foo && git init bar --bare
cat >bar/hooks/post-receive <<'EOF'
sed -n 's,^[^ ]* [^ ]* refs/heads/master$,git update-ref refs/heads/master-subtree -m "Auto-tracking master" $(git commit-tree master:subtree -m "Auto-tracking master subtree" $(test -r refs/heads/master-subtree \&\& echo -p refs/heads/master-subtree)),p' | sh -x
EOF
chmod a+x bar/hooks/post-receive
cd foo
mkdir subtree && touch subtree/oooo && git add . && git commit -am-
git push ../bar master
后期更新 --
如果您要与其他 repo 共享文件系统,您可以这样做:
git clone --no-checkout /path/to/local/repo/.git subtree
cd subtree
git commit-tree origin/rev:subtree </dev/null | xargs git checkout -B peek
您可以通过将 rev 更改为适合、origin/master:include、origin/next:include、origin/v1.4:somewhereelsenow 等来随意反弹。
我通常有一个用于大型回购的“空”分支。 Git 确实处理空目录的一种特殊情况:
git mktree </dev/null | xargs git commit-tree | xargs git checkout -b empty