【问题标题】:Is it possible in git to push commits one by one instead of all of them at once?在 git 中是否可以一个一个地推送提交而不是一次推送所有提交?
【发布时间】:2017-12-22 15:47:47
【问题描述】:

我正在使用一个非常不可靠的连接,当我尝试进行提交时,它们都不会超过 20mb 和/或一旦它们达到这样的大小就推送它们,有时这是不可能的(一些资产可以要大 - 我知道将 git 用于资产也不是最好的主意)并且在发送所有内容之前我的连接有 90% 的可能性会失败。

是否可以逐个推送提交,或者您能否建议任何其他可能对这种情况有用的提示?

【问题讨论】:

  • 问题:你知道提交只会保存它和前一次提交之间的更改吗?添加一个 10 MB 文件的 10 次提交不等于 100 MB。如果您更改了该 10 MB 文件中的一行,git 将仅存储该行更改的记录。
  • 出于好奇......你在这么大的 git 存储库中存储了什么?

标签: git push commit


【解决方案1】:

只是为了澄清另一个答案:

git push <remote name> <commit SHA>:<remote branch name>

例子:

git push origin c01c4fa28a0c864c2d09f8fb43a80c46dce9c7c6:master

【讨论】:

    【解决方案2】:

    是的,这不仅是可能的,而且实际上是微不足道的。而不是:

    git push remote branch
    

    运行:

    git push remote <commit-hash>:branch
    

    每次提交尝试推送一次,以适当的(父级到子级)顺序。

    要自动执行此操作,假设您的遥控器名为 origin 并且您的分支名为 branch 并且您的 origin/branch 远程跟踪分支是最新的(如果不是,请运行 git fetch origin):

    for rev in $(git rev-list --reverse origin/branch..branch); do
        git push origin $rev:branch;
    done
    

    这实际上是为了 StackOverflow 发布目的而分成三行的单行代码。 (注意:这也假设了或多或少的线性历史;如果没有,请添加 --topo-order 以保证事情,但是您将需要 --force 并且这里会出现各种不好的想法,所以这不是要走的路:您可能会想要拆分推送以使用临时分支,或者在合并点聚合它们。)

    【讨论】:

    • 如果这是远程不存在的新本地分支怎么办?
    • @StevenShaw:在这种情况下,您必须手动选择起点提交。我们在上面的&lt;exclude&gt;..branch 表达式中使用origin/branch,因为我们知道它是远程已经拥有的提交,所以第一个git push 从第一个可到达的提交开始之后,这可能是origin 缺少的第一个提交。找到合适的起点后,可以使用git push 创建origin/branch,也可以手动创建,之后上面的代码片段就可以工作了。
    • 如果不清楚(我不确定):origin/branch 是一个本地名称,它在遥控器上保存您自己的 Git 内存 branch。如果我们没有它,我们不能使用它。一旦我们创建它,我们就可以使用它。我们可以通过多种不同的方式创建它。我们只需要它来启动整个过程,所以如果你的连接是可靠的——如果你不需要频繁重启这一系列git push-es——你可以写for rev in $(git rev-list --reverse &lt;hash&gt;..branch); do ... .但是,如果您的连接可靠,那么您一开始就不需要任何这些。
    • 谢谢,我已将“来自”切换为origin/master,如git rev-list --reverse origin/master..branch。唯一的问题是远程分支不存在,因此git push 会失败,因为远程引用不存在。我不知道如何在不推送本地分支的情况下创建“空”远程分支(这会破坏 1-by-1 推送提交的目的)。
    • @StevenShaw:origin/master 通常会起作用,但可能需要强制推动才能开始“真正的”提交。 git merge-base origin/master branch 将是一个更好的起点:git push -u origin $(git merge-base origin/master branch):refs/heads/branch 将在您的本地存储库中创建 origin/branch 并将其设置为 branch 的上游,之后一对一推送将起作用。
    猜你喜欢
    • 1970-01-01
    • 2019-09-14
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 2010-12-19
    • 1970-01-01
    • 2014-12-23
    相关资源
    最近更新 更多