git-subtree push --squash需要很长时间,并且随着时间的推移越来越长

Meg*_*dno 11 git git-subtree

我一直在使用git子树扩展(https://github.com/apenwarr/git-subtree).我使用"--squash"来使主项目的日志干净,我的步骤如下:

  1. 将lib添加到主项目中

    git subtree add -P sub/libdir --squash lib_remote master

  2. 从lib获取更新

    git subtree pull -P sub/libdir --squash lib_remote master

  3. 将更改推送到lib_remote

    git subree push -P sub/libdir --squash lib_remote master

它对我来说非常好(主要项目和lib,有一个很好的历史).问题是git子树推送的时间越来越长.

我使用git-subtree的目的与Screndib几乎相同,Screndib要求 git-subtree不保留历史,所以我不能推动子树更改,我怎样才能解决这个问题/将来避免这个问题?

我想,当使用--squash时,每次处理推送时,git子树需要搜索自"子树添加"以来的整个历史记录.

如何减少子树推送的时间?或者让它更有效,而不是整个历史,只有自上次git子树推送(或拉动)以来的流程变化?

wey*_*amz 5

我假设您的代码中的“lib_remote”是远程 lib 存储库的网址,而不是您当前存储库中的一个分支?当前存储库中的远程存储库 url 和分支都在工作。

我看到您正在使用git subtree add将远程库添加为子树,然后您只是使用git subtree push推送更改。

最好git subtree split在push操作之前先把子树的变化拆分成你当前repo中的一个单独的分支,然后把拆分的分支推送到远程repo,保持这个拆分的分支存在,每次push之前,做一个git subtree split操作再次,这将从您上次拆分的点构建子树的历史记录,速度会快得多。否则,如果没有像您那样进行拆分,git subtreee 必须从您添加的点开始构建子树的历史记录,只要子树提交增长,构建的时间就会越来越长。

如果不是边--squash添加边使用,可以考虑边--rejoin拆分边使用,这样会快很多。

所以,步骤应该如下。

  1. 将lib添加到主项目中

    git subtree add -P sub/libdir --squash lib_remote_url master

  2. 从 lib 获取更新

    git subtree pull -P sub/libdir --squash lib_remote_url master

  3. 将子树更改拆分为单独的分支

    git subtree split -P sub/libdir -b lib_remote_branch

  4. 将更改推送到 lib_remote

    git push lib_remote_url lib_remote_branch:master

保持 lib_remote_branch 存在,下次推送时重做第 3 步和第 4 步。

  • 感谢您的关注,但我没能成功。问题是:执行步骤 3 和步骤 4,再进行一些提交,然后再次执行步骤 3。时间还是越来越长。即使在分裂之后,子树似乎仍然处理自“添加”以来的整个历史记录。使用 --rejoin 而不是 --squash ,这应该有效。但我真的不希望 sublib 的整个历史合并到主项目中,这将使得很难从主项目的 gitk 中获取任何意义。我完全按照您的描述进行操作,我可能做错了什么吗? (3认同)
  • 将其存储在单独的分支中根本无法解决问题 (2认同)