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にジャンプしてリポジトリをチェックアウトしましたが、最新のコミットが見つかりません。::スクラッチヘッド::だから私はもう一度押す:

Everything up-to-date

うーん...それはそれのようには見えません。私はこれまでこの問題を経験したことがありませんが、これはgithubの問題でしょうか?または、gitプロジェクトで何かを台無しにしましたか?

編集

気にしないでください、私は簡単なことをしました:

git push origin master

そしてそれはうまく押しました。

回答:


219

これは、ローカルでrootとしてgitを実行したように見えるため、originブランチの場所を追跡する一部のファイルの所有権が変更されます。

ファイルの所有権を修正すれば、問題はありません。

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

1
そのコマンドは私のために働いた。クローンのルートから実行しました。ありがとう@CharlesDuffy!
ariestav 2013

4
@ Mr.Stranger、正しいIFS値とユーザー名がある場合のみ(スペース付きのユーザー名は、たとえばcygwinで発生する可能性があります)。引用する方が安全です:sudo chown -R "$USER" .、そして正気を前提としないでください。:)
Charles Duffy

Mr.Stranger @、...また、USERによって保証されていないpubs.opengroup.org/onlinepubs/009695399/utilities/...ので、使用する方が安全です"$(id -un)"
Charles Duffy 2016年

それは私のユーザーを言いますis not in the sudoers file. This incident will be reported.-私が何ができるかについてのヒントはありますか?ありがとう。
giovannipds 2017年

1
上記の構文はパラメーター展開です。"${var:-default}"変数の値に展開されます"$var"ただし、その値が空であるか未設定の場合は、に解決されdefaultます。したがって、に展開するか、を"$USER"実行して生成された出力に展開しid -unます。
チャールズダフィー

4

それが正確に不平を言っていることに集中しましょう:

権限拒否エラー:参照 'refs / remotes / origin / master'を更新できません。

再帰的なmod /所有権の変更を行う前に、そのファイルに移動し、正しくないアクセス許可を修正してください。

この問題の原因は、rootのときにブランチを作成し、そのブランチをユーザーとしていじろうとしたことだと思います。


3
ソースツリー全体を1つずつ所有することが期待されるユーザー以外の誰かが所有するファイルを修正することは本当に改善されていますか?
チャールズダフィー

2

私の場合、root権限でローカルにファイルを作成し、ローカル権限でコードをリモートにプッシュしようとしました。だから私はこのコマンドを実行しました

$find . -user root

すべてのファイルが所有者として「ルート」を持っているものを見つけるため。次に、次のコマンドを使用して、ルートの下にあるすべてのファイルの所有者をローカルに変更しました

$sudo chown parineethat `find . -user root`

その後、コードをローカルからリモートにプッシュすることができました。


sudo chown parineethat `find . -user root` 信頼性が低い-スペースを含むファイル名では正しく機能しません。代わりに、sudo find . -user root -exec chown parineethat {} +。関連する議論については、BashPitfalls#1を参照してください。
Charles Duffy 2017

1

これにより、すべての.gitファイルとディレクトリが再帰的に(ルートから1000に)変更され、ターミナルで行われたすべての変更の完全なリストが表示されます。

sudo 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ユーザーによってルートや書き込み可能で所有されたかった何らかの理由場合は、(標準的であるとして、各ユーザーは、自分のグループを持っているシステム上で)それを行うための安全な方法はにありchown -R root:user directory、そして次にchmod -R 775 directory(または770、他のアカウントも読み取りアクセスを必要としない場合)。
Charles Duffy 2015

1
@JasonGlissonは、大規模なセキュリティホールを作成することによってのみ「機能」するものであり、壊れたままにしておく方がよいでしょう。
Charles Duffy 2016年

1
@JasonGlisson、私たちがコミュニティとして、そしてコミュニティのメンバーとしてアドバイスを提供している限り、私たちが提供するアドバイスの種類と質は、他の誰よりも私のビジネスです-そして、セキュリティで働く人として、私はこの件についてコメントするのに適しています。最初のコメント、re:impactを参照してください。
Charles Duffy

1
@ JasonGlisson、...私のアドバイスがうまくいかなかった理由については、詳細を確認する必要があります。コマンドのログが順番に実行され、各コマンドの前に現在の作業ディレクトリが表示されます。放出されたエラーのテキスト。など-コメントするために; しかし、その議論の場所は、ここではなく、悪い結果を報告している回答に添付されます。
Charles Duffy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.