我目前正在将项目从Team Foundation版本控制转移到Git
。我使用git-tf
成功完成了两次,将代码下载到本地git存储库,然后将该存储库推送到新的远程存储库。
在我的第三个项目中,当我尝试推送时,我收到以下错误:
错误:解压缩失败:错误树对象 e934502276892b903347a524cb066a14a19d8ac0被拒绝:树 包含一个条目无效的相对路径为' .git'。
当我推送到TFS
或GitHub
时,我无法弄清楚这可能是什么。如果有人知道如何补救,我将非常感激。
谢谢!
答案 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.hasdotgit
或fsck.HASDOTGIT
。camelCase只是一种惯例。)
答案 1 :(得分:0)
所以我弄清楚问题是什么。两年前,Git仓库被添加到目录并签入TFS。它被删除并检入。似乎因为我的Git存储库具有此历史记录,它将因torek概述的原因而抛出错误。
我的解决方案是将历史记录截断到此签入后的日期,之后一切都推得很好。
感谢您的帮助