私は既存のプロジェクトを持っており、herokuにデプロイされ、gitの制御下にあります。私は定期的にコードを追加してコミットしています。
最近、作業中のコンピューター(OSX、10.6)を再構築しましたが、
git status
変更が表示されますが、変更したファイルをコミット用に追加しようとすると、
Dans-iMac-335:[app-name-obscured] Apple$ git add public/javascripts/*
fatal: Unable to write new index file
Heroku gitリポジトリからプロジェクトのクローンを作成し、そこに追加できます。 2つのプロジェクトのファイルの所有権は同じです。何が原因でしょうか?私のオプションは、変更された各ファイルを新しく複製されたバージョンに追加し、その方法で再構築することですが、多くの変更があり、ここで修正があるようです。
誰かがこれを経験しました、そしてどこから始めるべきアイデアはありますか?
クリス:徹底的な返事をありがとう。
Sudoを使用してgitを実行できます。その意味では、ディレクトリは755であり、私が所有し、同封のファイル644は再び私が所有しています(プロジェクトファイルを所有しているのと同じユーザー)が、アクセス許可の問題のようです。たくさんのディスクスペースがあり、ディレクトリが書き込み可能であるという提案は良いものですが、プロジェクトを含むディレクトリ内からgitを実行していました-それでもパスを作成する必要がありますか?
システムにktraceが見つからず、端末操作の専門家ではありませんが、dtrussを実行してみました。問題はありませんでしたが、dtrusを実行するためにSudoを使用する必要があったため、dtrusが監視しているプロセスもスーパーユーザーとして実行されていることに気付きました。いずれにせよ、その時点でアイテムをgitに追加することができ、Sudoを使用して今すぐコミットすることができました。問題は、変更されたアイテムではなく、新しいアイテムを追加するときです。私が次のようなことをした場合
Sudo dtruss su <my_username> git add some/file/name/*
通常の名前としてgitを実行できたでしょうか?望みの結果を得るために自分の道をハックした後、私はこれを考えました。
今のところ、アイテムが追加されてコミットされる操作にSudoを使用して生きることができます。私がやりたいのは、herokuリポジトリを現在の作業にインライン化することです。それから、それを複製して、問題が解決するかどうかを確認できます。そうでなければ、私は戻ってきます…
インデックスは通常、リポジトリの.git
ディレクトリの最上位に保存されます。その場所は、GIT_INDEX_FILE環境変数を使用してオーバーライドできます(次のことを確認する価値があるかもしれません:printf '%s\n' "$GIT_INDEX_FILE"
)。
インデックスファイルのディレクトリが書き込み可能でない場合は、以前のエラーメッセージが表示されます。
fatal: Unable to create '/path/to/.git/index.lock': Permission denied
このエラーメッセージが表示されなかったため、含まれているディレクトリが書き込み可能であると確信できます。
報告されたエラーメッセージは、git addのアクティビティの最後の方で発行されます。残念ながら、errno
はgit add;によって報告されません。報告されていれば、報告されたエラーに基づいて問題を推測できる可能性があります。
git addは、新しいインデックスの内容の書き込みに問題がある場合(内容は.lock
ファイルに書き込まれます)、または試行したときに報告されたエラーを示しますロックファイルをコミットする(既存のインデックスファイルの代わりに.lock
ファイルの名前を変更します。これはロックファイルトランザクションを「コミット」することであり、git commitします)。
インデックスファイルを保持するボリュームの空き容量はどうですか?多分それはほぼいっぱいです。インデックスが.lock
ファイルを作成するのに十分な空き領域があるが、コンテンツ全体を保持するのに十分ではないボリューム上にある場合、エラーメッセージを再現することができました。
インデックスファイルにフラグが設定されていますか?私のシステムでは、インデックスファイルにuchg
(「ユーザーレベルの不変」)またはuappnd
(「ユーザーレベルの追加のみ」)が設定されていると、が発生します。 git addを使用して、表示されているのと同じエラーメッセージを表示します。インデックスファイルでls -lO
のフラグを確認します(フラグはグループ所有者の後、サイズの前に表示されます。フラグが設定されていない場合は-
が表示されます)。フラグが表示された場合は、 chflags コマンドを使用してフラグを削除します。フラグがどのようにそこに到達したか、および他のファイルにフラグが含まれているかどうかを調査することをお勧めします(おそらくls -lOR
を使用)。
上記の提案のいずれも解決策を促さない場合は、ktraceとkdumpを分割して、失敗しているシステムコールを見つけることができます。エラーメッセージが出力される直前。
ktrace git add whatever
kdump | less
: Go to the bottom. Search for the error message.
: What CALL is RETurning -1? What is the reported errno?
ボリュームがいっぱいになると、次のように表示されます。
4728 git CALL write(0x9,0x116d24,0x18b0)
4728 git RET write -1 errno 28 No space left on device
4728 git CALL write(0x2,0xbfffcd00,0x26)
4728 git GIO fd 2 wrote 38 bytes
"fatal: Unable to write new index file
"
互換性のないフラグを設定すると、次のように表示されます。
4742 git CALL rename(0x105bdd,0xbfffdfa8)
4742 git NAMI ".git/index.lock"
4742 git NAMI ".git/index"
4742 git RET rename -1 errno 1 Operation not permitted
4742 git CALL write(0x2,0xbfffcd40,0x26)
4742 git GIO fd 2 wrote 38 bytes
"fatal: Unable to write new index file
"