该树包含一个无效路径为“.git”的条目

Mat*_*den 2 git

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

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

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

我无法弄清楚这可能是什么,因为当我推送到TFS或时它失败了GitHub。如果有人知道如何补救,我将不胜感激。

谢谢!

tor*_*rek 5

出于一些良好的安全原因,Git 拒绝将任何文件存储在任何名为.git. (如果 Git确实允许.git文件,则.git/hooks/commit在 Git 存储库中命名的文件将成为您的提交钩子,并且您运行的下一次提交将运行攻击者放入该文件的任意命令。有一个检查可以避免这种情况,但结果是稍有损坏。)出于特定于实现的原因,此特定安全问题显示为“包含'.git'”的错误“树对象”,该对象通过 .git 配置hasDotGit1

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

从 Git 2.6 版本开始,您可以将 Git 配置为接受某些错误的存储库项目,即使您通常已打开检查。(在 2.6 之前,您必须完全关闭检查。)您可以选择忽略某些问题,将某些问题降级到警告级别,将警告升级为错误,和/或通过哈希 ID 忽略某些特定对象。此配置必须完成服务器; 我不知道是否可以以及如何在您正在使用的服务器上完成。另请参阅此 GitLab 论坛帖子,这表明某事或某人随着时间的推移一直在关闭和打开此功能。

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

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

$ git config fsck.hasDotGit warning
Run Code Online (Sandbox Code Playgroud)

在该特定存储库中。

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


1短信的确切形式经过国际化,但默认为contains '.git',配置字符串为hasDotGit

配置字符串不明显,似乎没有正确记录。它们是通过获取fsck.c 源代码中枚举名称并去除所有下划线并转换为小写字母而形成的,然后在您喜欢制作驼峰式名称的任何地方重新大写。(git config字符串比较是在不区分大小写的情况下完成的,因此您可以实际配置fsck.hasdotgit或者fsck.HASDOTGIT如果您愿意。camelCase 只是一个约定。)