4

我遇到了一个奇怪的问题,当我尝试将更改从本地存储库推送到远程存储库时,有时(并且这种情况经常发生),git 的行为就像无法识别现有分支并尝试推送所有对象( 20.000+),即使我只对其中的两个进行了更改,并且从状态 0000000000000000000000000000000000000000

样本:

me@my-desktop:~/repo/project/$ git push origin feature/myFeature 
Fetching remote heads...
  refs/
  refs/tags/
  refs/heads/
  refs/heads/feature/
updating 'refs/heads/feature/myFeature'
  from 0000000000000000000000000000000000000000
  to   161612d12a7a474fda294036e34c268131dbcb04
    sending 21322 objects

更新:我使用 git flow 和功能进行分支。

4

2 回答 2

1

假设您使用的是 http 推送(使用 DAV),我在 git 源的 http-push.c 中注意到以下内容:

/*
 * NEEDSWORK: remote_ls() ignores info/refs on the remote side.  But it
 * should _only_ heed the information from that file, instead of trying to
 * determine the refs from the remote file system (badly: it does not even
 * know about packed-refs).
 */

如果这个评论是准确的,那么问题是遥控器已经打包了目标引用,并且(正如评论所指出的)推送找不到引用,所以它正在发送每个对象。

因此,正如Matija Nalis在评论中所建议的那样,git gc接收方导致了问题。您可以通过在接收器上重新创建解包 ref 来测试这一点:

cd (path to repo .git directory)
(verify that refs/heads/branch does not exist)
awk '$2 == "refs/heads/branch" { print $1 }' packed-refs

(写结果行,假设有一个,到refs/heads/branch,然后尝试推送)。

由于我不使用网络推送,我无法自己验证这一点。

于 2014-03-07T20:45:31.223 回答
0

该错误应该使用 Git 2.28(2020 年第三季度)修复:由于对象标志位的分配不正确,通过“哑”HTTP 推送更改的代码与提交可达性代码的交互不良,这已得到纠正。

请参阅brian m的提交 64472d1(2020 年 6 月 23 日) 。卡尔森 ( bk2204) .
(由Junio C Hamano 合并 -- gitster--提交 67d99b8中,2020 年 7 月 6 日)

http-push:确保数据丢失时非强制推送失败

报告人:Michael Ward
签字人:René Scharfe
签字人:brian m. 卡尔森

当我们使用基于 DAV 的协议进行推送时,客户端是执行 ref 更新的人,因此会检查是否应允许非强制推送。

我们通过确定是否

  • (a) 我们缺少 ref 旧值的目标文件或
  • (b) ref 的新值不比旧值新,

无论哪种情况,都拒绝推送。

但是,ref_newer执行后一种检查的函数由于重复使用某些对象标志而具有奇怪的行为。

具体来说,它将在第一次调用中错误地返回 false,然后在后续调用中正确返回 true。

发生这种情况是因为 使用的对象标志与 使用的对象标志http-push.c相同commit-reach.c,后者实现ref_newer,并且一段代码误解了另一段设置的标志。

请注意,这并非在所有情况下都会发生。

例如,如果将测试中使用的示例更改为使用一个存储库而不是两个存储库,并回退头部以添加提交,则测试通过并且我们正确地拒绝了推送。

但是,提供的示例确实触发了这种行为,并且至少从 Git 2.0.0 开始,代码就以这种方式被破坏了。

为了解决这个问题,让我们移动两组对象标志,使它们不重叠,因为我们显然同时使用它们。新集合不应与其他用法冲突,因为其他用户要么是内置代码(未编译到 中git http-push)要么upload-pack(我们在这里同样不使用)。

于 2020-07-19T17:10:19.407 回答