Git错误:对象xxxx:hasDot:包含“。”

5
我破坏了(本地)git仓库。问题出在我的Python脚本中添加了以'./'开头的文件名。
当我尝试进行git push操作时,会得到以下错误信息:
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (6/6), 4.03 KiB | 0 bytes/s, done.
Total 6 (delta 1), reused 0 (delta 0)
remote: error: object a6cc7dfb40e8c513415315d6ed84143448bd4f99: hasDot: contains '.'
remote: fatal: Error in object
error: unpack failed: unpack-objects abnormal exit
To git@framagit.org:xxx/yyy.git
 ! [remote rejected] master -> master (unpacker error)
error: failed to push some refs to 'git@framagit.org:xxx/yyy.git'

当我谷歌搜索时,唯一与我的问题相关的是这个未回答的SO问题,其中作者遇到了hasDotgit: 包含'.git'错误。
我运行了git show a6cc7dfb40e8c513415315d6ed84143448bd4f99:
./
./file1
./file2
...
file1
file2
...

并且 git fsck --full

warning in tree a6cc7dfb40e8c513415315d6ed84143448bd4f99: hasDot: contains '.'

我认为我需要在git中删除./files,但是git rm "./file1"会删除常规的file1文件,而不是./file1。如果我再次运行该命令,我会得到以下内容:

fatal: pathspec './file1' did not match any files

我不知道该怎么办,因为在互联网上找不到关于这个问题的任何信息,即使在git源代码中搜索也没有显示任何结果。我宁愿在普通的git中修复这个问题,而不是再次使用python模块(顺便提一下,当我尝试删除文件时,它还会给我fatal:pathspec错误)。 编辑1git ls-tree --long --abbrev --full-name a6cc7dfb40e8c513415315d6ed84143448bd4f99
040000 tree 22b75ee       -     .
100644 blob d519532    3580     file1
...
100644 blob 03e914c    6754     fileN

列表中没有./file

Edit2: 如果使用--full-tree代替--full-name,则结果相同。


你能展示一下 git ls-tree --long --abbrev --full-name a6cc7dfb40e8c513415315d6ed84143448bd4f99 的输出吗? - Roman
抱歉,命令有些错误。请将“--full-name”替换为“--full-tree”,然后再次运行(输出可能相同,但为了确保,请检查)。 - Roman
1
检查可以在fsck.c中找到,它意味着树包含一个字面上命名为“.”的条目,我们可以在ls-tree输出中看到。我怀疑最简单的修复方法是使用命令行git重新创建有问题的提交。 - Roman
@Roman:不错的发现 - 看起来 fsck.c 在创建错误消息时会跳过一些步骤,这些步骤最终使得在源代码中使用grep查找错误消息变得非常困难。fsck.c 使用xmacros从错误ID创建错误消息,但也会转换ID,以便从消息中删除下划线并将大多数(但不是全部)字符转换为小写。因此,打印出来的内容接近于代码中的标识符,但不同之处足以使得当你的起点是:“我遇到了这个错误,它是从哪里来的?”时很难进行grep查找。 - Michael Burr
感谢您的帮助。 - René
2个回答

8

看起来没有撤销错误提交是不可能的。

如果其他人查找hasDothasDotgit,你可以通过以下方式进行修复:

git reset --soft fbc2d1cae724acc7b8d83442ca94088d836fea55
      #delete all commits after the last good one (fbc2), but keep files (--soft)
git rm --cached "." -r -f       #git rm all files but keep them locally (--cached)
git add .                       #git add everything back
git commit -m "msg"

1
我知道我的回答有些晚了,但它可能会对其他人有所帮助。
我使用git-filter-repo来重写我的整个项目历史记录,排除任何提到.git路径的内容(在我们的情况下,这些是过时的文件,本来就不应该被提交)。
git filter-repo --invert-paths --path-glob '*.git'

git-filter-repo 的安装说明可以在这里这里找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接