git:无法索引文件-权限被拒绝。

43

只有一个文件,我收到了以下错误:

error: unable to write sha1 filename /opt/www/.git/objects/3f/ce3587c54a8be14c69b08c6b01f94949b11b47: Permission denied

error: wp/wp-admin/css/theme-install.dev.css: failed to insert into database
fatal: unable to index file wp/wp-admin/css/theme-install.dev.css

我检查了与问题相关的文件,包括.git对象目录和.git本身的权限。除了这一个文件外,我可以添加任何其他文件。我可以stat/r/w/touch该文件,但进行touch操作并没有帮助。所有的权限都是正确的。

这是什么奇怪的bug吗?


1
你能否在.../objects/3f中“touch”新文件,如果不能,那么它的模式是什么? .../objects/3f/ce3...是否已经存在,如果是,那么它的模式是什么? /opt所在的分区可能已满吗? - Greg Bacon
触摸是可以的,文件不存在。 - h4xnoodle
在这种情况下我也遇到了同样的问题:有一个名为"imafile"的文件,删除该文件后创建了一个名为"imafile"的目录并放入文件,但由于无法找到索引而无法提交。 - Flozza
9个回答

70
如果你正在使用Visual Studio或类似软件生成mdf文件,只需关闭VS并重试git命令即可。这次应该可以成功。
为避免频繁地关闭和重新打开,应将引用添加到项目根目录中的.gitignore文件中。例如,如果是数据库引起的问题,请添加以下内容:
# SQL Server files
*.mdf
*.ldf

这对我有用。我在尝试使用VS提交Unity项目时遇到了问题。关闭它后,错误消失了。 - nktsamba
这非常令人沮丧,因为这意味着我无法使用Team Explorer来管理我的代码。我必须在Visual Studio中进行所需的更改,关闭应用程序,提交我的更改,重新打开应用程序并恢复工作。一定有一个解决办法。 - devklick
Klicker,将导致此问题的任何文件放入忽略文件中,就像我上面建议的*.mdf文件一样。那就可以解决问题了。 - ShrapNull
对我来说起作用了。只是关闭了VS,运行了 git add 命令,然后就能顺利提交了。 - drethedevjs

19
从 Git 源代码(`sha1_file.c`,函数 `move_temp_to_file()`)来看,Git 未能将名为 `/opt/www/.git/objects/3f/tmp_obj_XXXXXX`(其中 `XXXXXX` 是六个随机字符)的临时文件重命名为 `/opt/www/.git/objects/3f/ce3587c54a8be14c69b08c6b01f94949b11b47`。如果您没有权限删除 `/opt/www/.git/objects/3f` 目录中的文件,则会出现此问题。
尝试以下一些方法:
- 如果有多个用户访问 Git 存储库,则可能需要运行类似于 `git config core.sharedRepository 0664` 的命令(有关详细信息,请参见 `git help config`),以确保新创建的目录和文件对存储库的所有用户具有适当的权限。 - 尝试运行 `rm -f /opt/www/.git/objects/3f/tmp_obj_*` 命令,看看是否可以解决问题。 - 看看是否可以通过执行以下操作在 Git 外部复现问题:
mkdir -p /opt/www/.git/objects/3f
cd /opt/www/.git/objects/3f
rm -f tmp_obj_* ce3587c54a8be14c69b08c6b01f94949b11b47
echo "testing" >tmp_obj_abcdefg
mv tmp_obj_abcdef ce3587c54a8be14c69b08c6b01f94949b11b47
rm -f tmp_obj_abcdefg

请确保以上命令是以经历错误的相同用户身份运行的。

  • 尝试递归地对对象目录进行 chownchmod

  • 由于某种未知原因,我确实拥有一些属于root的对象。 - Gra

    18

    只需关闭 Visual Studio(或 Unity),然后尝试重新添加这些文件。


    2
    我已关闭了Node.js服务器,我的AngularJS应用程序停止运行,索引文件已解锁。 - Radu Linu
    那个方法是可行的,但是假设我同时打开了4个项目,我不能关闭所有这四个项目只是为了将文件添加到git。难道没有其他解决方案,不需要关闭它吗? - mrid
    是的,当您使用Visual Studio锁定它时,它可以正常工作。 - Yahor10

    10

    您没有在/opt/www/.git/objects/3f中写入的权限。

    最快的解决方法是使用sudo命令以root权限执行您的命令。

    sudo <您的git命令>

    这个方法对我来说解决了问题。


    1
    对我来说有效...我认为在我的情况下导致这种情况的原因是在之前的提交过程中中途中止了。 - ahwillia

    5

    你的git仓库出现了问题,很可能是由于外部进程创建了一个文件或目录,该文件或目录的所有者与当前用户不同。

    在使用Docker时,如果docker-compose.yml文件中的服务具有本地挂载卷,并且该卷是使用与本地机器用户不同的用户创建的,则此错误很常见。

    如果这是第一次出现此错误,请在工作目录上执行以下操作,以将文件和文件夹的所有权更改回已登录的用户:

    sudo chown -R ${USER}:${USER} .
    

    如果您不是第一次遇到此问题,即已经提交并推送了属于另一个用户的文件和文件夹,则仅执行上述操作将无法纠正该情况。除了执行上述命令外,您还需要执行以下操作。
    迄今为止,最快的修复方法是从包含您的git存储库的根项目目录中执行以下操作:
    sudo chown -R ${USER}:${USER} .git/objects
    

    为了测试所有问题都已解决,请执行以下操作:

    git add .
    

    紧接着执行:

    git status
    

    您会发现所有内容都已添加到git存储库中,而无需进一步测试/摆弄任何内容。

    这是正确的解决方案,如果您在git命令中使用了sudo,则会更改.git文件夹中的某些权限,从而导致此错误。 - Ben Winding

    2
    error: open("3/BasicMVVM/.vs/BasicMVVM/v16/Server/sqlite3/db.lock"): Permission denied
    

    错误:无法索引文件3 / BasicMVVM / .vs / BasicMVVM / v16 / Server / sqlite3 / db.lock 致命错误:添加文件失败

    如果您在使用Visual Studio时遇到此错误,请先关闭Visual Studio。 然后在Git Bash中适当的位置输入“git add *”(不需要引号)。 这对我有用。


    1
    你的回答不清楚。请检查它是否有帮助。 - Jayakumar Thangavel

    0

    当我试图将一个doc文件推送到已经打开的GIT hub时,这个问题发生了。之后我关闭它并再次尝试,成功推送。


    你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

    0

    当我的裸源存储库权限为root:git 770时,我遇到了这个问题,显然我必须将其更改为771,即使我的用户在git组中。我怀疑可能是git不支持acl,或者与辅助组不兼容,因为在这种情况下,git组是我的辅助组之一。


    0

    我停止在IntelliJ(用于Java编程)中运行我的Driver.main()方法,并能够使用git add .命令将所有文件添加到暂存区。另外,您可以尝试重新启动IntelliJ或其他用于编写代码的工具作为第二个选项。


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