致命错误:无法创建临时文件'/home/username/git/myrepo.git/./objects/pack/tmp_pack_XXXXXX':权限被拒绝。

56

最近我一直遇到这个错误信息,但我不理解如何正确解决或进行调试。我已经在各种形式的搜索引擎上搜索过这个错误,但没有找到真正的解决方案。我认为这可能与权限有关,但我不知道如何检查或应该检查什么。

我的服务器运行着 Ubuntu 11.10,我正在尝试从我的开发机器向 Git 仓库做初始提交。我使用 root 权限运行。我是否应该以普通用户身份运行?

在服务器上创建仓库:

$ cd /home/username/git
$ mkdir myrepo.git
$ cd myrepo.git/
$ git --bare init

在开发机上创建代码仓库:

Goto rails project directory first
$ git init
$ git add .
$ git commit -m "initial commit"
$ bundle pack
$ git add Gemfile.lock vendor/cache
$ git commit -m "bundle gems"
$ git remote add origin ssh://username@server.com/home/username/git/myrepo.git
$ git push origin master

错误:

fatal: Unable to create temporary file '/home/username/git/myrepo.git/./objects/pack/tmp_pack_XXXXXX': Permission denied
error: pack-objects died of signal 13
error: failed to push some refs to 'ssh://username@server.com/home/username/git/myrepo.git'

我的 .git/config 文件:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
[remote "origin"]
    url = ssh://username@server.com/home/username/git/myrepo.git
    fetch = +refs/heads/*:refs/remotes/origin/*

类似问题: 如何使用Git进行初始推送到远程仓库?

9个回答

68

听起来你在git repo中有一个由root拥有的文件。既然你使用'username' ssh登录进行推送,那么文件必须可被username写入。最简单的方法可能是作为用户创建repo,并使用相同的用户执行推送。另一个选择是创建一个组,让所有文件都可被该组写入,并将你的用户添加到该组成员中。


1
没错,这对我有用。我切换到创建“git”文件夹的用户,并为我的存储库创建了一个目录。进入该目录并运行“git --bare init”。然后从我的Windows机器推送到它,它就起作用了! - Andrew Backes
@FranciscoCorralesMorales 有什么需要帮忙的吗? - Don Branson
1
@DonBranson 如何创建群组,如何将用户添加到群组,如何使目录可被群组写入。 - Brian D
@BrianD - 搜索一下,因为我相信这些问题已经在Superuser、Serverfault或者例如Ubuntu上得到了解答。 - Don Branson
1
好的,这里有一些提示:用户组在/etc/group中列出。将用户添加到组中:https://superuser.com/a/95976/636934。将文件夹的所有者更改为该组(`chown`),并更改文件夹的权限(`chmod`)。 - Brian D

27

好的,我搞清楚了。问题在于我的repo.git和父目录git没有设置正确的权限。

以root身份登录服务器并使用以下命令:

$ chown username /home/username/git

接着,以下是返回的内容:drwxrwxr-x 4 username root 4096 2012-10-30 15:51 /home/username/git。

$ ls -ld /home/username/git

接下来我会在git中创建一个名为myrepo.git的新目录:

$ mkdir myrepo.git
$ ls -ld myrepo.git/
drwxr-xr-x 2 root root 4096 2012-10-30 18:41 myrepo.git/

但它的用户设置为root,所以我以与之前相同的方式将其更改为用户名。

$ chown username myrepo.git/
$ ls -ld myrepo.git/
drwxr-xr-x 2 username root 4096 2012-10-30 18:41 myrepo.git/
我随后注销root账户并登录服务器的用户名为username的账户:
进入git目录:
$ cd myrepo.git/
$ git --bare init
Initialized empty Git repository in /home/username/git/myrepo.git/

在本地计算机上:

$ git remote add origin      
ssh://username@server.com/home/username/git/myrepo.git
$ git push origin master

成功!

希望这对将来遇到相同问题的任何人都有所帮助!

资源


2
非常有帮助!感谢您逐步浏览,使我能够找出问题所在。 - DrCord
仍无法推送。 - Snow

3
似乎您的用户没有服务器上该目录的写入权限。请确保权限正确。用户需要对该目录具有写入权限。

针对这种情况,正确的权限应该是什么样子的? - rjd
1
取决于情况。也许是 chmod 660 <那个目录> - Ryan Bigg

2

推送到GIT的主要问题之一是,你所推送的内容将被视为你自己的材料,并会阻止团队中其他人提交。作为GIT存储库管理员,你需要管理钩子来防止Alice的推送阻止Bob的推送。为此,你需要确保你的开发人员都属于一个组,让我们称之为“developers”,并且该存储库归root:developers所有,然后将以下内容添加到hooks/post-update脚本中:

sudo chown -R root:developers $GIT_DIR
sudo chmod -R g+w $GIT_DIR

这将使团队成员能够在推送到代码库时互不干扰。


2
感谢Don Branson,我解决了我的问题。我认为下一次在服务器上构建我的repo时,我应该使用这段代码:
root@localhost:~#mkdir foldername
root@localhost:~#cd foldername
root@localhost:~#git init --bare
root@localhost:~#cd ../
root@localhost:~#chown -R usergroup:username foldername

在客户端,我使用以下代码:
$ git remote add origin git@servername:/var/git/foldername
$ git push origin master

0
一个可能性是你正在推送到的git服务器已经宕机/崩溃了,解决方案在于重启git服务器。

0

我通过为用户在每个你使用的目录上分配权限来解决这个问题,如下所示:

sudo chown user /home/user/git

等等。


0
在我的情况下(WINDOWS 10),它是Microsoft Defender(我刚刚从另一个杀毒软件换成了Defender)。
我只需将我的C:\Users\USERNAME\PROJECT-PATH.git\objects\pack放入排除列表中,然后就可以神奇地解决了。 :)

WINDOWS 10 / VISUAL STUDIO 2019 或 GIT FOR WINDOWS


0

尝试通过根访问执行以下命令 - "chmod -R 777 /home/username/git"


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