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

Просто установлен 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

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

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

Пример

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

mkdir temp

перейдите в папку temp

cd temp/

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

git clone [-b branchName] [email protected]_to_your_git_repository

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

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

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

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

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

Ответ 5

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

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

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

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

Ответ 6

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

Небольшое разглашение: 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

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

Ответ 7

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

git config --unset core.bare

Ответ 8

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

Ответ 9

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

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

git ошибка gui

Ответ 10

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

Ответ 11

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

Относительно логики к моему делу, я получал это сообщение об ошибке "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 локально и снова запустил repo sync . . . и попробовал успех!

Ответ 12

Тот же вопрос, который я получил, я сделал следующие шаги,

  1. мерзавец
  2. мерзавец добавить.
  3. git commit -m "начальная настройка"
  4. git push -f мастер оригинала

тогда это работа начинает работать.

Ответ 13

Отредактировал файл конфигурации и изменил bare = true на bare = false

Ответ 14

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

Способ, которым я получил эту ошибку, состоял в том, что я создал репозиторий Git на сетевом диске. На одном компьютере он работал нормально, но на другом возвращал эту ошибку. Оказалось, что я сопоставил диск с буквой диска Windows на компьютере, где я его создал, но не на другом компьютере, и Git сохранил путь к рабочему дереву как сопоставленный путь, а не путь UNC.