「致命的:この操作は作業ツリーで実行する必要があります」というメッセージが表示されるのはなぜですか?


83

Windowsにgitをインストールしたばかりです。GIT_DIR変数をc:\ git \に設定し、この環境変数がcygwinによって維持されていることを確認しました(つまり、echo $ GIT_DIRが本来あるべき姿です)。gitリポジトリを作成したいフォルダ(たとえばc:\ www)に移動し、次のコマンドを実行しました。

git init
git add .

次に、エラーが発生します。

fatal: This operation must be run in a work tree

何が悪かったのかわかりませんが、c:\ gitディレクトリには次のような設定ファイルがあります。

[core]
    repositoryformatversion = 0
    filemode = false
    bare = true
    symlinks = false
    ignorecase = true

私はこれがむき出しであってはならないと確信しています、そしてそれは私たちの問題です。


1
GIT_DIRは、CVSROOTとはまったく異なる概念です。
innaM 2009

回答:


54

エラーの直接の理由は、はい、git-add裸のリポジトリで使用することは不可能であるということです。定義上、ベアリポジトリには作業ツリーがありません。git-addコミットの準備として、作業ツリーからファイルを取得し、それらをインデックスに追加します。

ただし、ここでの設定については、少し考える必要があるかもしれません。GIT_DIRは、すべてのgitコマンドに使用されるリポジトリディレクトリです。あなたは本当にあなたが追跡するすべてのもの、おそらくあなたのシステム全体のもののために単一のリポジトリを作成しようとしていますか?gitリポジトリは本来、単一のディレクトリの内容を追跡します。GIT_WORK_TREE追跡するすべてのものを含むパスに設定する必要があります。次に、追跡する必要の.gitignoreないすべてのものをブロックする必要があります。

たぶんあなたはちょうど追跡するリポジトリを作成しようとしていますc:\wwwか?次に、それをc:\www挿入する必要があります(GIT_DIRを設定しないでください)。これはgitの通常の使用法であり、リポジトリは「モジュール」の最上位ディレクトリの.gitディレクトリにあります。

本当に正当な理由がない限り、gitの動作方法に固執することをお勧めします。追跡するものがいくつかある場合は、おそらくいくつかのリポジトリが必要です。


10
1.「EverydayGITin 20commands」とLinusTによるgit-init(1)manpPageをフォローしています(残念ながら古くなっている可能性がありますか?)2。あなたの投稿は何が悪いのかを示唆しているだけですが、それについて何をすべきかの手がかり

54
ただgit config --unset core.bare
Matthias Urlichs 2015年

私の問題はbljの回答によって解決されましたが、そのサブフォルダー内で、git branchコマンドを使用してブランチを一覧表示することはできましたが、できませんでしたgit checkout -b feature22。つまり、ブランチを一覧表示するために作業ツリーは必要ありませんが、チェックアウトする場合は必要です。
ハニー

203

また、おそらく.gitサブフォルダー内にいるので、1つ上のフォルダーをプロジェクトルートに移動します。


7
私が見たベストアンサー!受け入れられた答えでなければなりません。
GeertVc 2018

これがベストアンサーです。今まで見た中で。小さな問題。小さな解決策。大好きです。
Ariful Islam

2
このメッセージを抑制する方法はありますか?
roachsinai

笑...あなたは私を手に入れました。+1
fungusanthrax

17

私に起こったことが他の誰かに起こっている場合に備えて、私はこれを言う必要があります:このエラーが発生したとき、私はプロジェクト内の.gitディレクトリにいました。私は答えを探して探しましたが、何もうまくいきませんでした。私がしなければならなかったのは、正しいディレクトリに戻ることだけでした。それは私にとって一種の顔の手のひらの瞬間でした。私のように愚かな人が他にいる場合は、この回答がお役に立てば幸いです。


1
同様の経験。私の場合、GitExtensions(Windows用)を使用していて、リポジトリを開こうとしたときに、含まれているフォルダーではなく、クリックして.gitファイルを開きました。最初は問題ないように見えましたが、実際に何かを始めたときにツリーエラーが発生しました。
2017

1
私はこれが十数の賛成票を持っているのが大好きです。当たり前のように思えますが、この回答を投稿してよかったです。
Jacob Zimmerman

12

ただ、クローン別のフォルダ内の同じプロジェクトをコピー.git /プロジェクトにフォルダを。

一時フォルダーを作成します。

mkdir temp

一時フォルダに切り替えます

cd temp/

同じプロジェクトを一時フォルダーに複製します。

git clone [-b branchName] git@path_to_your_git_repository

.gitフォルダーをプロジェクトにコピーします。

cp -R .git/ path/to/your/project/

プロジェクトに切り替えて実行します git status

終了したら、一時フォルダを削除します。

これが誰かを助けることを願っています


1
これは便利だと思いましたが、最初の行で何が悪かったのかを理解するのに十分だったと言わざるを得ません。それの残りは実際に私を少し混乱させました。とにかくどうもありがとう:)
randombee 2016

@randombeeこれは私のために働いた。。。しかし、なぜ?これは何をしますか?
Yatharth Agarwal


8

GIT_DIR環境変数を明示的に設定すると、gitは指定されたディレクトリをgitリポジトリとして使用するように強制されます。通常の使用では必要ありません。

あなたの例では、が指定されていてGIT_DIR、名前が付けられておらず.git(先頭のドットが重要です)、--work-treeオプションを指定していないか、GIT_WORK_TREE環境変数を設定していないため、と言っgit initたときにベアリポジトリが必要です。

ベアリポジトリには作業ツリーがないため、コマンドの大規模な選択はベアリポジトリでは意味がありません。git addただ1つです。

.git作業ツリールートの下のサブフォルダーではなく、gitリポジトリに非標準の場所を使用する必要がある特別な理由はありますか?これを調整することは可能ですが、作業が増え、ユーザーのミスが発生しやすくなる傾向があります。


GIT_WORK_TREEを設定すると、問題が解決しました。GIT_DIRを使用している理由は、数分ごとに追加/コミットするだけのバックグラウンドタスクがある作業コピー用に個別のgitリポジトリが必要なためです。このプロセスは、GIT_DIRを.gitsaveに設定します。私の実際のレポ作業は.gitにあります。これで、ローカルのライブトラッキングリポジトリがあるので、変更したすべてのファイルのバージョンがあります。
MikeJansen

6

ベアGITリポジトリを作成する

小さな怒り:gitはそれ自体では通常のベアリポジトリを作成できません。確かに愚かなgit。

正確には、空のリポジトリのクローンを作成することはできません。したがって、空のリポジトリは役に立たないリポジトリです。実際、通常は空のリポジトリを作成し、すぐにそれを埋めます。

git init
git add .

ただし、ベアリポジトリを作成する場合、gitaddは使用できません。

git --bare init
git add .

「致命的:この操作は作業ツリーで実行する必要があります」というエラーが表示されます。

あなたもそれをチェックすることはできません:

Initialized empty Git repository in /home/user/myrepos/.git/
fatal: http://repository.example.org/projects/myrepos.git/info/refs not found: did you run git update-server-info on the server?

git --bare init
git update-server-info # this creates the info/refs file
chown -R <user>:<group> . # make sure others can update the repository

解決策は、別のリポジトリを作成し、そのリポジトリにファイルを追加して、それをベアリポジトリにプッシュすることです。

mkdir temp; cd temp
git init
touch .gitignore
git add .gitignore
git commit -m "Initial commit"
git push (url or path of bare repository) master
cd ..; rm -rf temp

これがあなたを助けることができることを願っています


1
これは単純に真実ではありません。ベアリポジトリを作成してクローンを作成することができます。それが真実であったとしても、それでも問題に対処することはできません。(例:$ git --bare init bare.git Initialized empty Git repository in /home18/cbailey/gittest8/bare.git/ $ git clone bare.git non-bare Cloning into 'non-bare'... \\ done. \\ warning: You appear to have cloned an empty repository.
CBベイリー

申し訳ありませんが、「<>」を使用して「ベアリポジトリのURLまたはパス」をパッケージ化すると、表示されなくなります。そして、私が逆さまに言ったことは本当に役に立ちます。私は自分自身をテストして検証しています。
user1329261 2012

4

.git/config含まれてworktree = D:/git-repositories/OldNameいるため、この問題が発生しました。に変更しましたworktree = D:/git-repositories/NewName

git guiを使用したため、より詳細なエラーメッセージが表示されることがわかりました

gitguiエラー


1
git bashを使用して、メッセージを受け取りましたfatal: this operation must be run in a work tree。設定ファイルを変更すると、修正されました。
pawellipowczan

4

私の場合、リポジトリの「.git」ファイルと同じフォルダーにいました。私は1つのディレクトリレベルを上げる必要がありました、それはそれを解決しました。


2

他に何も機能しないように思われる場合は、のパスを再確認してくださいgit config core.worktree。そのパスが作業ディレクトリを指していない場合は、更新する必要があるかもしれません。

このエラーが発生したのは、ネットワークドライブにGitリポジトリを作成したことです。あるコンピューターでは正常に動作しましたが、別のコンピューターではこのエラーが返されました。ドライブを作成したコンピューターではWindowsドライブ文字にマップされていましたが、他のコンピューターではマップされていなかったことが判明しました。Gitは、作業ツリーへのパスをUNCパスではなくマップされたパスとして保存しました。


1

既存の(ベアではない)チェックアウトでこのエラーが発生し始めた場合は、.git / configファイルを確認してください。場合はcore.baretrueで、その設定行を削除


0

上記の通常の方法のいずれも役に立たない場合は、このエラーメッセージ("fatal: This operation . . .")の下にある呼び出しトレースを見て、実際のエラーを引き起こしているスクリプトと行を見つけてください。そのerror()呼び出しを見つけたら、それを無効にして、いくつかの警告/メッセージがあっても、試行している操作が完了するかどうかを確認します。今は無視してください。もしそうなら、最終的に完了した後、それは正常に完了しなかった操作の部分に言及するかもしれません。ここで、必要に応じてこの部分に個別に対処します。

上記のロジックを私の場合に関連"fatal: This operation . . ."させて、Android-x86コードをで取得しようとしたときにこのエラーメッセージが表示されていましたrepo sync . . .。呼び出しトレースはraise GitError("cannot initialize work tree")、上記のエラーメッセージ("fatal: . . .")を引き起こすerror()呼び出しとして表示されました。そのため、でコメントしGitError()た後.repo/repo/project.pyrepo sync . . .適切に同期されなかった3つのプロジェクトのエラーを続行し、最終的に示しました。*.gitAndroid-x86ソースツリーの関連するパスからローカルでフォルダーを削除し、repo sync . . .再度実行して成功を味わいました。


0

私が得たのと同じ問題、私は次の手順を実行しました、

  1. git init
  2. gitadd。
  3. git commit -m "初期設定"
  4. git push -f origin master

それからそれは働き始めます。



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