Почему я получаю сообщение "фатальный: эта операция должна выполняться в дереве работ?"
Просто установлен 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
Тот же вопрос, который я получил, я сделал следующие шаги,
- мерзавец
- мерзавец добавить.
- git commit -m "начальная настройка"
- git push -f мастер оригинала
тогда это работа начинает работать.
Ответ 13
Отредактировал файл конфигурации и изменил bare = true на bare = false
Ответ 14
Если больше ничего не работает, перепроверьте путь в git config core.worktree
. Если этот путь не указывает на ваш рабочий каталог, вам может потребоваться обновить его.
Способ, которым я получил эту ошибку, состоял в том, что я создал репозиторий Git на сетевом диске. На одном компьютере он работал нормально, но на другом возвращал эту ошибку. Оказалось, что я сопоставил диск с буквой диска Windows на компьютере, где я его создал, но не на другом компьютере, и Git сохранил путь к рабочему дереву как сопоставленный путь, а не путь UNC.