Почему я получаю сообщение " fatal: эта операция должна выполняться в рабочем дереве?"

только что установлен git на Windows. Я установил переменную 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

Я довольно конечно, это не должно быть голым, и это наша проблема.

12 ответов


причиной ошибки является то, что да, невозможно использовать git-add с "голый" репозиторий. Голый репозиторий, по определению, не имеет дерева работы. git-add берет файлы из дерева работы и добавляет их в индекс, готовясь к фиксации.

возможно, вам придется немного подумать о своей настройке здесь. Git_dir-это каталог репозитория, используемый для всех команд git. Вы действительно пытаетесь создать единый репозиторий для всего, что вы отслеживаете, возможно вещи по всей вашей системе? Репозиторий git по своей природе отслеживает содержимое одного каталога. Вам нужно будет установить GIT_WORK_TREE на путь, содержащий все, что вы хотите отслеживать, а затем вам понадобится .gitignore блокировать все, что вы не заинтересованы в отслеживании.

возможно, вы пытаетесь создать репозиторий, который будет отслеживать только c:\www? Тогда вы должны положить его в c:\www (не устанавливайте GIT_DIR). Это нормальное использование git, с репозиторием в.каталог Git из каталог верхнего уровня вашего "модуля".

если у вас нет действительно веской причины, я бы рекомендовал придерживаться того, как git любит работать. Если у вас есть несколько вещей для отслеживания, вам, вероятно, нужно несколько репозиториев!


кроме того, вы, вероятно, внутри .подпапка git, переместите одну папку в корневой каталог проекта.


на случай, если то, что случилось со мной, происходит с кем-то еще, я должен сказать это: Я был в своем .каталог git в моем проекте, когда я получал эту ошибку. Я искал и искал ответы, но ничего не помогало. Все, что мне нужно было вернуться в нужную директорию. Для меня это был момент ладони. Если есть кто-то еще, такой же глупый, как я, надеюсь, вы нашли этот ответ полезным.


просто клон тот же проект в другой папке и скопировать на .git/ папка с вашим проектом.

пример

создать папку temp:

mkdir temp

переключатель temp папку

cd temp/

клонировать тот же проект в temp:

git clone [-b branchName] git@path_to_your_git_repository

копировать .папка git для вашего проекта:

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

переключитесь на свой проект и беги!--4-->

удалить на temp папка, если вы закончили.

надеюсь, что это поможет кому-то


явная установка GIT_DIR переменная среды заставляет git использовать данный каталог в качестве репозитория git. Он никогда не нужен во время нормальной пользы.

в вашем примере, потому что был указан GIT_DIR и он не называется .git (точка важно) и вы не предоставили и выберите GIT_WORK_TREE переменная среды, что вы хотите голый репозиторий, когда вы сказали git init.

потому что голый репозиторий не имеет рабочего дерева a большой выбор команд не имеет смысла с пустой репозиторий. git add - только один.

есть ли особая причина, по которой вам нужно использовать нестандартное расположение для вашего репозитория git, а не в .git папку в рабочей корень дерева? Хотя это можно организовать, это, как правило, больше работы и более подвержено ошибкам пользователей.


создать голый репозиторий GIT

небольшая тирада: git не может создать обычный голый репозиторий сам по себе. Действительно глупый мерзавец.

чтобы быть точным, невозможно клонировать пустые репозитории. Таким образом, пустой репозиторий-бесполезный репозиторий. Действительно, Вы обычно создаете пустой репозиторий и сразу же заполняете его:

git init
git add .

однако git add невозможен при создании голого репозитория:

git --bare init
git add .

дает ошибку " fatal: Эта операция должна выполняться в рабочем дереве".

вы не можете проверить это:

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

надеюсь, что это может помочь U


в моем случае, я был в той же папке,".git " файл для моего РЕПО. Мне пришлось подняться на один уровень выше, это решило проблему.


у меня была эта проблема, потому что .git/config содержится worktree = D:/git-repositories/OldName. Я просто изменил его на worktree = D:/git-repositories/NewName

я обнаружил это, потому что я использовал git графический интерфейс, который показал более подробное сообщение об ошибке:

git gui error


Это должно решить:

git config --unset core.bare

если ни один из вышеперечисленных обычных способов не поможет вам, посмотрите на трассировку вызова под этим сообщением об ошибке ("fatal: This operation . . .") и найдите скрипт и строку, которая вызывает фактическую ошибку. Как только вы обнаружите этот вызов error (), отключите его и посмотрите, завершится ли операция, которую вы пытаетесь выполнить, даже с некоторыми предупреждениями/сообщениями - игнорируйте их сейчас. Если да, то, наконец, после завершения он может упомянуть часть операции, которая не была завершена успешно. Теперь рассмотрим эту часть отдельно как применимый.

Что касается выше логики в моем случае, я получал это сообщение об ошибке "fatal: This operation . . ." когда я пытался получить код Android-x86 с помощью repo sync . . .. и след звонка показал raise GitError("cannot initialize work tree") как вызов error (), вызывающий вышеуказанное сообщение об ошибке ("fatal: . . ."). Итак, после комментария, что GitError() на .repo/repo/project.py, repo sync . . . продолжение и, наконец, указал ошибки для трех проектов, которые не были должным образом синхронизированы. Я просто удалил их *.git папки из соответствующих путей в Android-x86 исходное дерево локально и ran repo sync . . . снова и снова вкус успеха!


та же проблема, которую я получил, я сделал следующие шаги,

  1. git init
  2. git добавить .
  3. git commit-m "inital setup"
  4. git push-F origin master

потом он работать начинает работать.


если существующая (не голая) проверка начинает давать эту ошибку, проверьте свою .файл git / config; если core.bare - Это верно, удалите config строки