【问题标题】:What is the most efficient way to push a set of changed commits in to a remote git repository?将一组更改的提交推送到远程 git 存储库的最有效方法是什么?
【发布时间】:2017-01-21 04:44:48
【问题描述】:

我有一个远程 git 仓库,有近 1000 次重度提交,即:

C1 -> C2 -> C3 -> ... -> C949 -> C950 -> ... -> C1000

最近,我发现在提交 C950 中,我在 repo 中添加了大型二进制对象。我使用git filter-branch --index-filter 命令删除了本地存储库中的文件。现在我的本地存储库如下所示:

C1 -> C2 -> C3 -> ... -> C949 -> C1001 -> ... -> C1051

我知道我可以撤消在远程存储库上的提交,然后推送更改。但是对于我的大型提交,我想确保以最有效的方式将我的更改推送到远程存储库。

更新 1: 到目前为止,很明显我应该在远程存储库上使用 push-force。但关键是我的远程仓库不允许 nonFastForward 合并。有没有其他方法可以解决这个问题?

【问题讨论】:

  • 您花费的时间已经超出了您可能节省的时间。只需强制推送新提示,如果 git 发送一些重复的流量,那是因为在一般情况下检测它需要更多的时间和流量,而不是在少数可以消除它的情况下节省。

标签: git version-control git-branch git-push


【解决方案1】:

目前您正尝试将一些更改的提交 (C1001 -> .. -> C1051) 重写到您之前已经推送过的仓库中(即提交 C950 -> .. -> C1000),所以,您必须强制推动。

关于远程 repo 上的 FastForward 配置,您应该可以直接访问远程 repo 以更改配置。

【讨论】:

  • 感谢 rebase -i
  • 我不能使用 --force-with-lease 开关,因为从 git 的角度来看,其他人已经更改了 repo,我应该先去拉!!!
  • 没错。如果您想在有人之前推送时强制推送,git 不会让您使用 --force-with-lease 执行此操作。这是正常的行为。因为如果你只是 --force,其他开发人员将失去他们的工作,这不是很好:)
【解决方案2】:

如果一些大对象没有被git使用,它会自动删除它们,并且不会与任何远程共享它们。

只需使用 :

推送使用过的引用
git push origin master

(根据需要将 origin 和 master 替换为您的遥控器和您的分支)。

它只会推送包含在 master 中的对象和提交,这不应该是你的大提交的情况。

【讨论】:

  • 我认为这个命令会失败,因为我的本地分支 repo 包含在服务器上找不到的提交。我的远程仓库也是如此。结果,我认为这个命令会失败。
  • 推送的目的是将新对象传输到服务器。如果您的意思是您的历史记录不是fast-forward(因此与当前现有的存储库不兼容),这是 filter-branch 命令的主要问题。如果要强制更新引用,请改用git push --force
  • 我使用了 'git push --force',但这又是错误信息:remote: error: denied non-fast-forward refs/heads/master (you should first pull) To @987654321 @! [远程拒绝] master -> master (non-fast-forward) 错误:未能将一些 refs 推送到 'path/to/your/url.git'
猜你喜欢
  • 1970-01-01
  • 2014-09-22
  • 2010-09-20
  • 2014-02-22
  • 2014-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多