Разбираюсь с git.
2 машины одна c mac os другая вирутальная ubuntu 10.10
версии git там и там одинаковые
1.на mac os делаю репозиторий заливаю туда несколько файлов
2.c ubuntu делаю clone и меняю содержимое файлов
3.делаю push обратно на mac os — все пушится и работает как надо
но при попытке что то изменить на mac os в репозитарии получаю сообщение:
git fatal: «This operation must be run in a work tree
почему так происходит? как это поправить и что я сделал не так?
-
Вопрос заданболее трёх лет назад
-
12467 просмотров
Пригласить эксперта
в репе —bare нельзя работать, у нее нет рабочего дерева. Сделано так специально, чтобы нельзя было вносить изменения напрямую в общую репу на сервере
Вообще ошибка «git fatal: This operation must be run in a work tree» означает, что вы пытаетесь запустить команды git не из рабочей папки репозитория. Рабочая папка — это та папка, в которой находится папка .git (точка git) непосредственно с репозиторием.
Тоже столкнулся с этой проблемой. В рабочей папке эта же ошибка
Все делаешь как ниже описано?:
# Machine #1:
mkdir test1.git && cd test1.git
git init
echo "TEST" > README
git add README
git commit -m "Initial commit"
# Machine #2
git clone ssh://xxxxx/Users/username/test1.git
echo "Str2" >> README
git add README
git commit -m "Second commit"
git push origin master
# Machine #1
git pull origin master
-
Показать ещё
Загружается…
12 февр. 2023, в 21:32
80000 руб./за проект
12 февр. 2023, в 21:30
2900 руб./за проект
12 февр. 2023, в 21:30
7000 руб./за проект
Минуточку внимания
Вопрос:
Я получаю “ведущая ветвь” [удаленная отклоненная] в настоящий момент проверена “ошибка – по существу та же проблема, что и OP в этом сообщении (ошибка Git push” [удаленный отказ] master → master (ветвь в настоящий момент проверена) “), и следующее – это то, что я сделал до сих пор, чтобы исправить это, но теперь кажется, что у меня есть выбор между тем, что вышеупомянутая проблема или новая – ошибка “пропавшего дерева”, и, как объясняется ниже, это где я сейчас застрял.
Также обратите внимание, что у меня другое требование, чем у другого вопроса. Я НЕ хочу два репозитория, один голый и один не-голый – только один репо (origin/remote), из которого локальные машины будут вытягивать/толкать код, и который является веб-сервером в реальном времени. В другой статье не было указано никаких требований в этих строках (и этот вариант там не рассматривался), но мои потребности очень специфичны, поэтому этот вопрос.
Также обратите внимание, что неизбежно, что иногда могут быть прямые изменения в этих файлах каталога на сервере (хотя и с использованием Git), вместо того, чтобы быть перенесенными с локальной рабочей станции на сервер (удаленный).
Сначала я перезаписываю репо, устанавливая его на голый (разработчик, который изначально установил Git на сервере, использовал команду git init
при настройке репо):
git init --bare
Затем, поскольку все мои серверные файлы уже присутствовали (это не пустая директория), я сделал первоначальный коммит, используя этот метод (обычный):
git add .
git commit -m "initial commit"
Затем я отредактировал файл .git/config
:
git config receive.denyCurrentBranch ignore
Мой текущий файл .git/config
сервера выглядит следующим образом:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[receive]
denyCurrentBranch = false
Я могу нажать фиксации успешно, НО, если я попытаюсь применить это:
git checkout -f
как предполагалось выше (предположительно, чтобы принять все коммиты и сбросить HEAD, чтобы включить все мои изменения?), я получаю следующую фатальную ошибку:
fatal: This operation must be run in a work tree
Нужно ли устанавливать рабочую строку в этот каталог? Если да, то как мне это сделать? И если я это сделаю, будет ли результат по-прежнему соответствовать моей заявленной цели (опять же, без отдельного голого и не-голого репозитория – только один каталог, который ТАКЖЕ обслуживает веб-сайт в реальном времени и находится в корневом каталоге сети)?
Есть ли что-то еще, что мне нужно сделать, чего я не хватает?
Я прочитал широко на stackoverflow по этой теме, в том числе: Git init –bare – Не работает на рабочем дереве фатально: эта операция должна выполняться в дереве работ. Разница между HEAD/Working Tree/Index в Git. Книга Pro-Git ( esp здесь: http://git-scm.com/book/ch2-2.html) Git-Flow (nvie): http://nvie.com/posts/a-successful-git-branching-model/
Вся помощь и комментарии получили высокую оценку. Спасибо!
Ответ №1
Вы создали готический репозиторий git (который сам по себе не имеет рабочего дерева). Готический репозиторий git – это рекомендуемый способ перехода, когда вы хотите нажать изменения.
И из вашего вопроса, я понимаю, что у вас есть какая-то настройка сервера, и каждый раз, когда вы делаете git push
, вы хотите, чтобы файлы на сервере обновлялись, чтобы отражать новые нажатые изменения.
Да, это возможно, но вам нужно разделить голый репо и дерево работы. Местоположение рабочего дерева должно соответствовать местоположению, где ваши файлы должны быть развернуты на сервере. Предположим, что это /foor/bar
. Установив крюк после приема, вы можете развернуть новые файлы в это место worktree, после каждого нажатия автоматически.
Это шаги для этой настройки:
-
Создайте каталог рабочего дерева, если он еще не существует.
mkdir -p /foo/bar
-
Создайте следующий скрипт и скопируйте его в виде обложек-репо
hooks/post-receive
#! /bin/sh GIT_WORK_TREE=/foo/bar git checkout -f
-
Отметьте этот скрипт как исполняемый файл:
chmod +x hooks/post-receive
Это все, что потребуется. Теперь попробуйте git push
и ваши новые изменения будут автоматически развернуты в /foo/bar
.
git checkout -f
: git checkout -f
сбрасывает все локальные изменения в любом из отслеживаемых файлов, и любые изменения в /foo/bar
будут потеряны при новой checkout -f
. Любые файлы, которые не отслеживаются в git, но созданы/сгенерированы в /foo/bar
, не должны быть затронуты.
Также я хотел бы предложить избавиться от изменений, внесенных вами в .git/config
, особенно для receive.denyCurrentBranch
.
Ваша конфигурация должна выглядеть так: IMO:
[core]
repositoryformatversion = 0
filemode = true
bare = true
logallrefupdates = true
Output of bower -v && npm -v && node -v
:
Additional environment details (proxy, private registry, etc.):
Windows 7 Pro
Git 2.11.1.windows.1
Steps to reproduce the issue:
- Run
bower install bootstrap#v4.0.0-alpha.6
Describe the results you received:
bower bootstrap#4.0.0-alpha.6 ECMDERR Failed to execute "git clone https://github.com/twbs/bootstrap.git -b v4.0.0-alpha.6 --progress . --depth 1", exit code of #12
Resolving deltas: 100% (41/41), done. Note: checking out '65ffb1c3b6e94440812a2e228cb8e8be512652ec'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them,
and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (n
ow or later) by using -b with the checkout command again. Example: git checkout -b <new-branch-name> fatal: This operation must be run in a work tree warning: Clone succeeded, but checkout failed.
You can inspect what was checked out with 'git status' and retry the checkout with 'git checkout -f HEAD'
Additional error details:
Cloning into '.'...
remote: Counting objects: 450, done.
remote: Compressing objects: 100% (437/437), done.
remote: Total 450 (delta 41), reused 118 (delta 6), pack-reused 0
Receiving objects: 100% (450/450), 3.05 MiB | 1.07 MiB/s, done.
Resolving deltas: 100% (41/41), done.
Note: checking out '65ffb1c3b6e94440812a2e228cb8e8be512652ec'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch-name>
fatal: This operation must be run in a work tree
warning: Clone succeeded, but checkout failed.
You can inspect what was checked out with 'git status'
and retry the checkout with 'git checkout -f HEAD'
Describe the results you expected:
Package should install.
Additional information:
I know this is very similar to #2321, but running set GIT_DIR=
(from cmd) or unset GIT_DIR
from Git Bash did nothing to help the issue.
I get the same error when trying to install a particular commit instead of a release. I noticed in the GitRemoteResolver
that there are two modes (fast and slow) and I thought slow mode might work better. It did not.
This is not specific for the Bootstrap package, this was happening with all packages.