Gitプッシュエラー:古いリンクを解除できません(権限が拒否されました)


190

リモートサーバーで、リポジトリのgitチェックアウトを行うためにpost-receiveフックを設定しています。

#!/bin/sh
GIT_WORK_TREE=/var/www/<website> git checkout -f

しかし、ローカルマシンからサーバーのgitリポジトリにプッシュすると、次のエラーメッセージが表示されます。

remote: error: unable to unlink old '<file>' (Permission denied)

これは何度も表示され、ほぼすべてのファイルに対して1つのエラーメッセージが表示されます。

しかし、私はgitを使用して変更できるREADME.txtファイルを持っています。ここにその権限があります。

-rw-r--r--  1 <serverusername>  <serverusername>  2939 Aug  2 10:58 README.txt

しかし、まったく同じ所有者と同じ権限を持つ他のファイルは、私にそのエラーを与えます。

別のWebサイトの別のローカルリポジトリには、ローカルマシンのユーザー名を所有者とするファイルがあり、リモートサーバーにプッシュすると、ファイルのリモートサーバーの所有者が尊重され、魅力のように機能します。

明らかにそれは権限関連のエラーのようですが、私はそれを修正する方法、何か提案を見つけることができませんか?

回答:


335

ファイルのリンクを解除する必要がある場合は、ファイルではなく、ファイルがあるディレクトリの「w」権限が必要です...


65
確かにそれが問題だったのでsudo chmod -R g+w、罪のあるフォルダを使用して修正しました。
rfc1484 2012

1
OMGありがとう。ファイルに対する権限が正しいと考えてイライラしました。更新は実際にmvは単なる上書きというよりはアクションに似ています。
doublejosh

1
dir権限を変更することでうまくいきました(ありがとう!)が、問題なくsftp経由で問題のファイルを手動で上書きできるので、奇妙です。奇妙なことに、gitが同じことを行おうとしたときにできませんでした。
ジョナサンスターク

1
また、ファイルを開いたままにしておくと、このエラーも表示されることに注意してください。私は自分の変更をプッシュすることができませんでした、なぜ同じエラーを持っていたことでした。
マティアス

1
ls -l画面の最初の文字はファイルの種類を示しており、権限とは関係ありません。残りの9文字は3つのセットに含まれ、それぞれがアクセス許可のクラスを3文字として表します。最初のセットはユーザークラスを表します。2番目のセットはグループクラスを表します。3番目のセットは、othersクラスを表します。g+wchmodコマンドでグループセット(与えg書き込みへのパラメータ)の許可(wパラメータ)
rfc1484


41

IDEを使用している場合、問題はおそらくそのファイルが何らかのプロセスで使用されたことです。Tomcatがファイルを使用しているように。その特定のプロセスを特定し、それを閉じてみてください。これで問題が解決するはずです。


12

私は同じ問題を抱えていましたが、上記の解決策はどれもうまくいきませんでした。問題のフォルダを削除しました。次に:

git reset --hard

残っているファイルを削除してgitステータスをクリーンアップし、次のようにしました。

git pull

ようやく動作しました。

注:フォルダーがビルドファイルを含むパブリックフォルダーであった場合は、ファイルを再ビルドすることを忘れないでください。


おかげで、私にとって他に何も機能しませんでした。削除することが唯一の選択肢のようでした。
math0ne 2018

私の場合、問題のフォルダは.gitです
Tushar Kathuria '10

11

フォルダの所有権に問題がある可能性があるので、現在のユーザーの所有権に設定します

sudo chown -R your_login_name /path/to/folder
あなたは解決策を見つけることができます[ここ] [1]

7

FWIW-同様の問題があり、これがそれを軽減したかどうか(permission modを超えて)はわかりません:この問題でブランチを使用していたEclipseを閉じます。


同様に、バージョン管理されたCSVファイルをExcelで開いたときにこのエラーが発生しました。Excelを閉じるだけで解決しました。これは、おそらくWindows上の他のアプリケーションにも当てはまり、編集中にファイルが開いているとプログラムがどのようにマークするかによって異なります。
Carel

3

これは古い質問ですが、Macユーザーには役立つかもしれません。

Time Machineからファイルを復元する代わりに、Time Machineから手動でファイルをコピーする場合は、ACLが追加されます、すべてにされ、アクセス権が台無しになる可能性があります。

たとえば、この記事の「Mac OS Xファイルのアクセス許可を修正する方法」のセクションでは、「全員」がカスタムのアクセス許可を持っていることを示しています。

不正な権限、http://dreamlight.com/how-to-fix-mac-os-x-file-permissionsから

それらのディレクトリ/ファイルからACLを削除する必要があります。このスーパーユーザーの回答がそれに含まれますが、コマンドは次のとおりです。

sudo chmod -RN .

次に、ディレクトリとファイルに適切な権限があることを確認できます。750ディレクトリと644ファイルに使用します。


2

(Intellijで)サーバーを実行しているときに、このエラーとその他の奇妙なgitエラーが発生します。サーバーを停止してgitコマンドを再試行すると、頻繁に修正されます。



2
sudo chown -R $USER:$USER .

私のために仕事をしました。


1

一部のファイルは書き込み保護されており、gitでも上書きできません。フォルダーのアクセス許可を変更して、書き込みを許可します(例:sudo chmod 775 foldername)

そして再びGitプル


0

また、ルートディレクトリ自体の権限も確認してください。

あなたが見つけるかもしれません:

drwxr-xr-x  9 not-you www-data  4096 Aug  8 16:36 ./
-rw-r--r--  1     you www-data  3012 Aug  8 16:36 README.txt
-rw-r--r--  1     you www-data  3012 Aug  8 16:36 UPDATE.txt

「許可が拒否されました」エラーがポップアップします。


0

引っ張るとローカルに変化が生じた可能性があります。

追跡されていないファイルを追加します。

git add。

Stashの変更。

git stash

ローカル変更を削除します。

git stash drop

sudo権限でプルする

sudo git pullリモートブランチ


それはすべてローカルファイルの権限に関するものです
。git
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.