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

89

Только что установил 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_DIR - это совершенно другая концепция, чем CVSROOT!
innaM

Ответы:

55

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

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

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

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

Каскабель
источник
10
1. Мы просто следуем «Ежедневному GIT в 20 командах» и git-init (1) manpPage от Линуса Т. (который, к сожалению, может быть устаревшим?) 2. В вашем сообщении только говорится, что не так, но нет подсказка, что с этим делать
55
Просто git config --unset core.bare.
Матиас Урликс
Моя проблема была решена с помощью ответа blj, но внутри этой подпапки с помощью git branchкоманды я смог перечислить ветки, но не смог git checkout -b feature22. Означает ли это, что для составления списка ветвей не требуется рабочее дерево, но для проверки оно требуется?
Мед
206

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

Blj
источник
7
Лучший ответ, который я видел! Должен быть принятый ответ.
GeertVc
Это лучший ответ. Я когда-либо видел. небольшая проблема. небольшое решение. любить это.
Ariful Islam
2
Есть ли способ подавить это сообщение?
roachsinai
19

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

Джейкоб Циммерман
источник
1
Аналогичный опыт. В моем случае я использовал GitExtensions (для Windows) и, пытаясь открыть репозиторий, я щелкнул, чтобы открыть файл .git вместо содержащей его папки. Сначала все выглядело хорошо, но когда я начал что-то делать, у меня возникла ошибка дерева.
чт
1
Мне нравится, что у этого есть дюжина голосов. Я рад, что опубликовал этот ответ, хотя он казался очевидным.
Джейкоб Циммерман
13

Это должно решить эту проблему:

git config --unset core.bare
Бабаджиде М. Мойби
источник
5
Если дадите решение. Также объясните, почему.
Я
2
Это устранило проблему для меня.
bpanulla 06
1
Мне это помогло. Мне все равно почему :)
Ярда Павличек
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
@randombee Это сработало для меня. . . но почему? Что это значит?
Ятхарт Агарвал
8

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

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

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

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

CB Bailey
источник
Установка GIT_WORK_TREE решила эту проблему для меня. Причина, по которой я использую GIT_DIR, заключается в том, что мне нужен отдельный репозиторий git для моей рабочей копии, где у меня есть фоновая задача, которая просто добавляет / фиксирует каждые несколько минут. Этот процесс устанавливает для GIT_DIR значение .gitsave. Моя фактическая работа репо находится в .git. Теперь у меня есть локальное репозиторий для отслеживания в реальном времени, поэтому у меня есть версии всех файлов по мере их изменения.
MikeJansen
6

Создайте чистый репозиторий 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

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

user1329261
источник
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
6

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

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

ошибка git gui

Коппор
источник
1
Я использовал git bash и получил сообщение fatal: this operation must be run in a work tree. Для меня это исправило изменение файла конфигурации.
pawellipowczan
4

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

Четан Джайн
источник
2

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

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

Сорен Бьорнстад
источник
1

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

ТорСаммонер
источник
0

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

geekie12
источник
0

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

  1. git init
  2. git add.
  3. git commit -m "начальная настройка"
  4. git push -f origin master

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

рагхавендра
источник
0

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

Мурт Мориарти
источник
0

Вдобавок, видимо, такая ошибка произойдет, если вы клонируете в NTFS Ram Drive.

Менди Барел
источник