Git错误:无法附加到.git / logs / refs / remotes / origin / master:权限被拒绝


87

我遇到了一个似乎无法解决的奇怪问题。这是发生了什么:

我在github存储库中有一些我不想要的日志文件。我发现此脚本可以完全从git历史记录中删除文件,如下所示:

    #!/bin/bash
set -o errexit

# Author: David Underhill
# Script to permanently delete files/folders from your git repository.  To use 
# it, cd to your repository's root and then run the script with a list of paths
# you want to delete, e.g., git-delete-history path1 path2

if [ $# -eq 0 ]; then
    exit 0are still
fi

# make sure we're at the root of git repo
if [ ! -d .git ]; then
    echo "Error: must run this script from the root of a git repository"
    exit 1
fi

# remove all paths passed as arguments from the history of the repo
files=$@
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $files" HEAD

# remove the temporary history git-filter-branch otherwise leaves behind for a long time
rm -rf .git/refs/original/ && git reflog expire --all &&  git gc --aggressive --prune

我当然先备份,然后再尝试。它似乎工作正常。然后,我做了一个git push -f并收到以下消息:

error: Unable to append to .git/logs/refs/remotes/origin/master: Permission denied
error: Cannot update the ref 'refs/remotes/origin/master'.

不过,一切似乎都进行得很好,因为文件似乎已从GitHub存储库中删除,如果我再次尝试进行推送,我会得到相同的结果:

error: Unable to append to .git/logs/refs/remotes/origin/master: Permission denied
error: Cannot update the ref 'refs/remotes/origin/master'.
Everything up-to-date

编辑

$ sudo chgrp {user} .git/logs/refs/remotes/origin/master
$ sudo chown {user} .git/logs/refs/remotes/origin/master
$ git push
Everything up-to-date

谢谢!

编辑

哦 问题。我整夜都在从事这个项目,只是去提交我的更改:

error: Unable to append to .git/logs/refs/heads/master: Permission denied
fatal: cannot update HEAD ref

所以我:

sudo chown {user} .git/logs/refs/heads/master
sudo chgrp {user} .git/logs/refs/heads/master

我再次尝试提交,我得到:

error: Unable to append to .git/logs/HEAD: Permission denied
fatal: cannot update HEAD ref

所以我:

sudo chown {user} .git/logs/HEAD
sudo chgrp {user} .git/logs/HEAD

然后我再次尝试提交:

16 files changed, 499 insertions(+), 284 deletions(-)
create mode 100644 logs/DBerrors.xsl
delete mode 100644 logs/emptyPHPerrors.php
create mode 100644 logs/trimXMLerrors.php
rewrite public/codeCore/Classes/php/DatabaseConnection.php (77%)
create mode 100644 public/codeSite/php/init.php
$ git push
Counting objects: 49, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (27/27), done.
Writing objects: 100% (27/27), 7.72 KiB, done.
Total 27 (delta 15), reused 0 (delta 0)
To git@github.com:IAmCorbin/MooKit.git
59da24e..68b6397  master -> master

万岁。我跳到http://GitHub.com并检出了存储库,而我的最新提交是在哪里找不到。:: scratch head ::所以我再次按下:

Everything up-to-date

嗯...看起来不像。我以前从未遇到过这个问题,这可能是github的问题吗?还是我的git项目搞砸了?

编辑

没关系,我做了一个简单的事情:

git push origin master

它推得很好。

Answers:


216

看起来您是在本地以root身份运行git的,因此更改了一些跟踪origin分支位置的文件的所有权。

修复文件所有权,您应该可以:

# run this from the root of the git working tree
sudo chown -R "${USER:-$(id -un)}" .

1
这个命令对我有用。我从克隆的根目录运行它。谢谢@CharlesDuffy!
ariestav

4
@ Mr.Stranger,仅当您具有合理的IFS值和用户名(例如,在cygwin上可以使用带空格的用户名)时。引用更安全:sudo chown -R "$USER" .,而不要理智。:)
查尔斯·达菲

@ Mr.Stranger,......也,USER不被保证pubs.opengroup.org/onlinepubs/009695399/utilities/...,所以它可能是更安全的使用"$(id -un)"
查尔斯·达菲

它说我的用户is not in the sudoers file. This incident will be reported.-关于我可以做什么的任何提示?谢谢。
giovannipds

1
上面的语法是参数扩展; "${var:-default}"扩展为变量的值"$var"除非该值为空或未设置,在这种情况下它将解析为default。因此,我们要么扩展到"$USER",要么运行生成的输出id -un
查尔斯·达菲

4

让我们专注于它到底抱怨什么:

权限被拒绝错误:无法更新ref'refs / remotes / origin / master'。

在进行递归mod ​​/所有权更改之前,请遍历该文件并修复所有不正确的权限。

我认为我是通过在root时创建一个分支,然后尝试以该用户的身份弄乱该分支的方式导致此问题的。


3
修复由用户以外的任何人拥有的文件,它们应该一对一地拥有整个源代码树,这真的是一种改进吗?
查尔斯·达菲,

2

就我而言,我在本地创建了具有root权限的文件,并尝试将代码推送到具有本地权限的远程。所以我跑了这个命令

$find . -user root

找出所有文件都以“ root”作为所有者的文件。然后我使用以下命令将根目录下所有文件的所有者更改为本地

$sudo chown parineethat `find . -user root`

然后,我可以将代码从本地推送到远程。


sudo chown parineethat `find . -user root` 是不可靠的-不能正确使用带空格的文件名。相反,sudo find . -user root -exec chown parineethat {} +。有关相关讨论,请参见BashPitfalls#1
查尔斯·达菲

1

这将递归更改所有.git文件和目录(从root到1000),并为您提供在终端中所做的所有更改的完整列表。

须藤chown -Rc $ UID .git /


0

我曾尝试修复Git的所有权,但仍然无法正常工作。

但是,我设法通过使用不同的名称创建本地分支并将其删除来修复它。

然后,我再次签出相同的分支名称,它可以正常工作。

TLDR;

我无法签出`staging / rc'。

因此,我staging改用远程结帐指向“ staging / rc”。

而且,我将其删除并再次结帐。但是,这次我staging/rc用作本地分支名称。

它有效,我不知道为什么。


-16

请首先从root以下帐户授予权限

chmod -R 777 foldername

之后,运行commit命令


7
这是非常危险的-它给系统上的任何帐户(包括仅具有“ nobody”特权的受感染守护程序)写入文件的权限。系统守护程序将“ nobody”(或其他无特权的帐户)用于对安全敏感的组件,因为即使没人入侵,nobody帐户也无法做任何冒险的事情。通过让所有用户(甚至没有用户)对您的文件具有写访问权限,您使基本的安全措施变得无用。
Charles Duffy 2015年

1
如果出于某种原因,您希望文件由root拥有,并且可以由特定的非root用户写入,则这样做的安全方法(在通常情况下,每个用户都有自己的组的系统上)是chown -R root:user directory,并且然后chmod -R 775 directory(或者770,如果其他帐户也不需要读取访问权限)。
Charles Duffy 2015年

1
@JasonGlisson,只有通过创建大量安全漏洞才能“起作用”的东西,可能最好还是保持不损坏。
Charles Duffy

1
@JasonGlisson,由于我们既要向社区提供建议,也要向社区提供建议,因此,作为社区成员,我们提供的建议的质量和质量与任何其他人一样,并且与从事安全工作的人一样,我很适合对这个话题发表评论。参见初步评论,重新:影响。
查尔斯·达菲

1
@JasonGlisson,...关于我的建议为何对您不起作用的原因,我需要查看详细信息-命令的日志按顺序运行,并在每个命令之前显示当前工作目录;发出的任何错误的文本;等-为了发表评论; 但是讨论的地方将附在您报告不好的结果的答案上,而不是这里。
查尔斯·达菲
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.