【问题标题】:Getting fatal: object is corrupted when pushing to a remote repo致命:推送到远程仓库时对象已损坏
【发布时间】:2012-05-30 23:52:00
【问题描述】:

我有一个安装了 Gitolite 的服务器来托管我的存储库我昨天和今天创建了一个新的存储库,当我尝试将更多提交推送到我得到的服务器时:

fatal: object 86eeaa0c5a154ff3df34d6a43669930b9c6c7f59 is corrupted
error: unpack failed: unpack-objects abnormal exit
error: failed to push some refs to

由于 repo 很新,我并不太担心丢失以前的提交,所以我删除了本地和远程 repo,但仍然遇到相同的错误。

正如我所说,我不太关心维护我的提交历史,我只想让它再次工作!

【问题讨论】:

  • 你确实通过在gitolite-admin repo 的本地克隆的gitolite.conf 文件中声明它来创建新的repo,并将gitolite-admin repo 推回gitolite 服务器,对吧? (见sitaramc.github.com/gitolite/repos.html)我猜你没有直接在gitolite服务器上git init自己?
  • 你有什么版本的gitolite?你做了一些'gl-xxx'命令(比如gl-setup)吗?即Gitolite V2。还是您制作了gitolite install(gitolite V3,或g3
  • 是的,我在本地机器上的 gitolite.conf 中声明了新的 repo,然后将其推送回 gitolite 服务器,然后我将该 repo 克隆到我的机器上添加了文件,提交并推回服务器。这很好用,只有当我第二次推送到服务器时。我正在使用版本 g3。
  • @VonC 我拥有的 over repo 工作正常,我可以克隆并将提交推送到。
  • 第一个repo(第二次push出现问题的那个),能不能直接克隆到gitolite服务器上(所以本地克隆/path/to/repo)看看能不能push回来了吗?

标签: git gitolite


【解决方案1】:

正如在 cmets 中所见,任何额外的 repo 在其创建过程中都会出现问题(即,当使用声明新 repo 的 gitolite.conf 文件推回 gitolite-admin repo 时)

我之前没有注意到这一点,但是当我创建一个新的仓库时,我收到了以下错误:

remote: line 1 too long: command="/home/git/gitolite/src/gitolite... 
remote: FATAL: fingerprinting failed for /tmp/Cdug9Itivq 

但它正在 /home/git/repositories 中创建存储库

此操作发生在名为ssh-authkeys 的编译后触发器中:

sub fp_file {
    return $selinux++ if $selinux; # return a unique "fingerprint" to prevent noise
    my $f = shift;
    my $fp = `ssh-keygen -l -f '$f'`;
    chomp($fp);
    _die "fingerprinting failed for '$f'" unless $fp =~ /([0-9a-f][0-9a-f](:[0-9a-f][0-9a-f])+)/;
    $fp = $1;
    return $fp;
}

这意味着ssh-keygen -l -f <path_to_public_key.pub> 没有遵循正确的模式,如“self service key management”所示。

确保您的密钥生成如下:

ssh-keygen -t rsa -f "${H}/.ssh/git" -C "Gitolite Admin access (not interactive)" -q -P ""

2015 年 4 月更新:

正如starfry 在“Gitolite - remote: FATAL: fingerprinting failed for 'keydir/'”中提到的:

OpenSSH 6.8 版中的密钥指纹格式发生了变化:

FingerprintHash 选项添加到ssh(1)sshd(8),并将等效的命令行标志添加到其他工具以控制用于密钥指纹的算法。默认从 MD5 更改为 SHA256,格式从 hex 更改为 base64。

指纹现在预先添加了哈希算法。
新格式示例:

SHA256:mVPwvezndPv/ARoIadVY98vAC0g+P/5633yTC4d/wXE

请注意,视觉主机键也会有所不同。

latest git checkout of gitolite is aware,自 2015 年 3 月 18 日起采用这种新格式。

【讨论】:

  • 感谢另一个非常有用的答案!我已经按照建议生成了一个新密钥。我现在需要用git.pub 键做什么?
  • @simon:按照sitaramc.github.com/gitolite/setup.html 中的描述使用该密钥(因此将 id.pub 重命名为专用于 gitolite ssh 管理的“通用帐户名”:参见 stackoverflow.com/questions/10736964/gitolite-admin-clone-issue/… 以获取说明),在为了再次启动gitolite-admin repo,克隆它,声明新的 repos,克隆它们,看看问题是否仍然存在。
  • 指纹版本随着OpensSSH 6.8的变化见this answer
  • @starfry 我明白了。我也在这里包含了您的答案,以提高知名度。
猜你喜欢
  • 1970-01-01
  • 2018-01-24
  • 2013-02-21
  • 1970-01-01
  • 2011-05-09
  • 2015-08-29
  • 2014-12-22
  • 2020-01-03
  • 1970-01-01
相关资源
最近更新 更多