Почему я получаю сообщение «Неустранимый: эта операция должна выполняться в рабочем дереве»? - PullRequest
59 голосов
/ 22 сентября 2009

Только что установил 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

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

Ответы [ 14 ]

155 голосов
/ 03 августа 2012

Кроме того, вы, вероятно, находитесь в подпапке .git, переместитесь на одну папку вверх к корню проекта.

46 голосов
/ 22 сентября 2009

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

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

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

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

13 голосов
/ 11 марта 2014

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

9 голосов
/ 18 апреля 2013

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

Пример

Создать временную папку:

mkdir temp

переключиться на temp папка

cd temp/

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

git clone [-b branchName] git@path_to_your_git_repository

скопируйте папку .git в свой проект:

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

переключитесь на ваш проект и запустите git status

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

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

6 голосов
/ 22 сентября 2009

Явная установка переменной среды GIT_DIR заставляет git использовать данный каталог в качестве хранилища git. Это никогда не требуется при нормальном использовании.

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

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

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

5 голосов
/ 09 июля 2012

Создать пустой GIT-репозиторий

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

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

git init
git add .

Однако, git add невозможен, когда вы создаете пустой репозиторий:

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

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

4 голосов
/ 04 сентября 2018

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

git config --unset core.bare
3 голосов
/ 17 мая 2018

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

1 голос
/ 13 августа 2018

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

1 голос
/ 20 марта 2017

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

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

git gui error

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...