git tree(still)包含重复项和错误信号13

时间:2014-05-20 21:13:30

标签: git github

我有一个像这样构建的git存储库。

$ git init

经过多次添加,提交和激烈的键盘敲击后,我准备将其推送到我的GitHub回购。

$ git remote add origin git@github.com:me/Foo.git
$ git push -u origin master
Counting objects: 456, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (125/125), done.
remote: error: object c9edb23c0e6c48772785b2a7d89d08c0807b2d4a:contains duplicate file     entries
remote: fatal: Error in object
error: pack-objects died of signal 13
error: failed to push some refs to 'git@github.com:me/Foo.git'

搜索SO时,我找到了文章git tree contains duplicate file entries并按照那里的说明进行操作。

$ git ls-tree c9edb > bad_tree.txt

删除重复的条目(只有1个!)

$ cat bad_tree.txt | git mktree
8ec5fe5a729ff6f71209cb9a4f75b0059c049190
$ git replace c9edb 8ec5f
$ git fsck --full
Checking object directories: 100% (256/256), done.
error in tree c9edb23c0e6c48772785b2a7d89d08c0807b2d4a: contains duplicate file entries
Checking objects: 100% (457/457), done.

好的,文章说fsck仍会显示坏树,但现在应该推动。让我们修复信号13. SO文章Can't push to GitHub error: pack-objects died of signal 13说它是一个文件大小的东西。好的,我们来看看吧。

$ git count-objects -v
count: 0
size: 0
in-pack: 457
packs: 1
size-pack: 1910
prune-packable: 0
garbage: 0
size-garbage: 0
嗯,这很奇怪。它说它只有1.9MB。我们仔细检查一下。

$ du -h .git
8.0K    .git/logs/refs/heads
12K     .git/logs/refs
24K     .git/logs
1.9M    .git/objects/pack
8.0K    .git/objects/info
1.9M    .git/objects
44K     .git/hooks
4.0K    .git/branches
12K     .git/info
4.0K    .git/refs/heads
4.0K    .git/refs/tags
4.0K    .git/refs/replace
16K     .git/refs
2.1M    .git

好的,有些事情很疯狂。 Git和文件系统一致认为整个存储库只有大约2MB,但我在推送时得到了信号-13。嗯。我们再试一次。

$ git push -u origin master
Counting objects: 456, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (125/125), done.
remote: error: object c9edb23c0e6c48772785b2a7d89d08c0807b2d4a:contains duplicate file     entries
remote: fatal: Error in object
fatal: The remote end hung up unexpectedly
error: pack-objects died of signal 13
error: failed to push some refs to 'git@github.com:me/Foo.git'

格儿。确实,“来自地狱的内容管理员”。我的回购只是蠢货吗?是否有可能在没有历史的情况下仅将最后一次提交推送到github? (并且最好不要让我的本地仓库远离另一个本地仓库并复制整个过程中的面食。)

2 个答案:

答案 0 :(得分:1)

相当偶然,我碰巧正在阅读O'Reilly Git book并使用git branch-filter找到了一个巧妙的小技巧。我应该注意duplicate entry错误是由于一个子文件夹被添加到索引中作为目录和单个提交中的符号链接(我不会再这样做了!)。

$ git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch src/dupe' master

即使我们刚刚从轨道上修改了这个子目录,但坏的blob仍然在回购中。

$ git fsck
Checking object directories: 100% (256/256), done.
error in tree c9edb23c0e6c48772785b2a7d89d08c0807b2d4a: contains duplicate file entries
Checking objects: 100% (457/457), done.

看起来git不想放弃那个blob!这是一个简单的解决方案。通过克隆回购物来处理悬空斑点(最安全)。

$ cd ~/Foo_new
$ git clone --no-hardlinks file://~/Foo

--no-hardlinks选项阻止git使用硬链接优化克隆,并确保克隆的repo包含来自旧repo的所有内容的副本,以便您可以安全地删除旧的repo。快速检查显示现在一切正常。

$ git fsck --full
Checking object directories: 100% (256/256), done.
Checking objects: 100% (433/433), done.

现在我需要重置我的遥控器,因为这是一个克隆的回购。

$ git remote set-url origin git@github.com:me/Foo.git

推送到github。

$ git push origin master
Counting objects: 433, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (115/115), done.
Writing objects: 100% (433/433), 471.04 KiB | 0 bytes/s, done.
Total 433 (delta 318), reused 433 (delta 318)
To git@github.com:me/Foo.git
 * [new branch]      master -> master

成功!

答案 1 :(得分:1)

我今天也遇到了同样的问题,在尝试了很多以上之后,我最终没有“关心”历史,而是决定将历史压缩成一个提交。

例如手头的情况:

  • 分公司大师破;
    • 尝试推送时出现错误13
    • 这发生在10-15左右的提交中
  • 分支来源/主人无法接收新更新

然后我执行了以下简单步骤:

  • git checkout master
  • git branch master_maintained_for_old_history
  • git reset origin / master --soft
  • git commit -a -m'单个squash commit ...'
  • git push -u origin master -f

当尝试进行交互式rebase时,这失败了,因为它仍然试图“重新使用”现有的“已损坏”提交进行重放,从而导致问题再次发生。 简单地抛弃所有破碎的历史并且只有一次提交的解决方案对我来说是最干净的。

干杯, 罗布