git-subtree:从克隆的repo中推送更改

arg*_*rge 10 git git-subtree

我正在使用git-subtree(来自Avery Pennarun).在我目前的git repo中,我当然拥有所有项目文件/文件夹和一个名为"lib"的子树.如果我现在克隆这个git repo使用git clone我得到所有的项目文件和子树"lib"(一切都应该是).我现在尝试了:我在克隆的repo中的子树"lib"中更改了一些东西并试图将更改推回到子树"lib"的远程仓库中 git subtree push,但是它没有用.问题是什么?我是否必须首先使用git子树添加将其添加为子树?

Thx提前

Rog*_*Rog 17

免责声明,我怀疑我只是提前几天学习子树:-)

如果您刚刚使用git subtree push,则不会提供足够的子树信息来提取和推送您的更改.

如果你正确地克隆了repo,那么子树就已经存在了.子树需要被告知要推送哪个子树(即使你只有一个),它还需要知道推送到哪里 - 具体来说,你不想推送到顶级仓库.因此,你需要这样的东西:

git subtree push --prefix=lib git@github.com:arges-github/lib.git master
Run Code Online (Sandbox Code Playgroud)

显然,应该更改repo和refspec以匹配您的repo.

如果你想查看这里发生的事情(并且它确实有帮助),子树实际上将影响子树内文件的更改拆分为不同的分支,然后将其推送到子树仓库.要看到这种情况,请使用subtree split

git subtree split --rejoin --branch=shared-changes --prefix=lib
Run Code Online (Sandbox Code Playgroud)

然后看看你做过的分支:

git checkout lib-changes
Run Code Online (Sandbox Code Playgroud)

并手动推送它们

git push git@github.com:arges-github/lib.git master
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,那么可能是您没有将子树合并到您的仓库中.添加子树时:

 git subtree add --squash --prefix lib git@github.com:arges-github/lib.git master
Run Code Online (Sandbox Code Playgroud)

您还需要合并子树并将其推回到顶级仓库.

 git subtree pull --squash --prefix lib git@github.com:arges-github/lib.git master
 git push
Run Code Online (Sandbox Code Playgroud)