该树包含一个条目无效的条目' .git'

时间:2016-09-14 09:29:52

标签: git

我目前正在将项目从Team Foundation版本控制转移到Git。我使用git-tf成功完成了两次,将代码下载到本地git存储库,然后将该存储库推送到新的远程存储库。

在我的第三个项目中,当我尝试推送时,我收到以下错误

  

错误:解压缩失败:错误树对象   e934502276892b903347a524cb066a14a19d8ac0被拒绝:树   包含一个条目无效的相对路径为' .git'。

当我推送到TFSGitHub时,我无法弄清楚这可能是什么。如果有人知道如何补救,我将非常感激。

谢谢!

2 个答案:

答案 0 :(得分:3)

出于某些安全原因,Git拒绝将任何文件存储在名为.git的任何目录中。 (如果Git 允许.git文件,Git存储库中名为.git/hooks/commit的文件将成为您的提交挂钩,您运行的下一个提交将运行任意命令攻击者放入该文件。有一个检查以避免这种情况,但事实证明它有点破坏。)由于特定于实现的原因,这个特定的安全问题显示为“包含'.git'”的坏“树对象”,通过hasDotGit 1

进行配置

并非每个版本的Git都有测试,并且随着多年来发现的新问题,新版本的Git已经获得了针对这些旧问题的新保护。如果有旧版本的Git,你的Git可能会允许存储不安全和/或不正确的项目 - 例如这个错误的tree对象。升级到更新版本的Git,或在某些服务器上访问更新版本的Git,有时会诊断甚至开始拒绝使用错误的存储库。

As of Git version 2.6, you can configure Git to accept certain bad repository items,即使您已开启检查。 (在2.6之前,您必须完全关闭检查。)您可以选择忽略某些问题,将某些问题降级到警告级别,将警告升级为错误,和/或通过其哈希ID忽略某些特定对象。此配置必须在 on 服务器上完成;我不知道是否以及如何在你正在使用的服务器上完成它。另请参阅this GitLab forum posting,其中表明某些事情或某人随着时间的推移开启此事。

作为参考,Git版本2.2.1,2.1.4,2.0.5,1.9.5和1.8.5是Git开始检查NTFS和MacOS(HFS)中拼写.git的点具体方式和不区分大小写(例如,在此之前,.Git.gIt.GIT都被认为是正常的 - 它们通常在Linux / Unix系统上。这些检查位于fsck.c中,并且可选地在所有包上载,下载和索引操作上调用。请参阅git config文档,搜索fsck的每个实例,因为有许多配置旋钮可以完全启用或禁用检查,或者更改问题的严重性。

要将hasDotGit的严重性降低到warning,您可以执行以下操作:

$ git config fsck.hasDotGit warning

在该特定存储库中。

除了重新配置服务器之外,您还可以选择重写坏存储库的历史记录(使用git filter-branch)以使其成为一个良好的存储库。但是,如果这样做,您将基本上强制所有用户重新克隆。

1 文本消息的确切形式经历国际化,但默认值为contains '.git',配置字符串为hasDotGit

配置字符串不明显,似乎没有正确记录。它们是通过取enumerated names in the fsck.c source并剥离所有下划线并转换为小写,然后重新上壳来形成camelCase名称而形成的。 (git config字符串比较是在不区分大小写的情况下完成的,因此如果您愿意,可以实际配置fsck.hasdotgitfsck.HASDOTGIT。camelCase只是一种惯例。)

答案 1 :(得分:0)

所以我弄清楚问题是什么。两年前,Git仓库被添加到目录并签入TFS。它被删除并检入。似乎因为我的Git存储库具有此历史记录,它将因torek概述的原因而抛出错误。

我的解决方案是将历史记录截断到此签入后的日期,之后一切都推得很好。

感谢您的帮助