Чому я отримую повідомлення "fatal: Ця операція повинна виконуватися в робочому дереві?"


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. Ми просто дотримуємось «Everyday GIT in 20 commands» та git-init (1) manpPage Лінуса Т. (що, на жаль, може бути застарілим?) 2. Ваш допис лише вказує на те, що не так, але не дає нам підказка, що з цим робити

55
Просто git config --unset core.bare.
Matthias Urlichs

Моя проблема була вирішена за допомогою відповіді blj, але всередині цієї підтеки за допомогою git branchкоманди я зміг перерахувати гілки, але не зміг цього зробити git checkout -b feature22. Чи означає це, що для переліку гілок йому не потрібно робоче дерево, а для перевірки це потрібно?
Мед

206

Крім того, ви, мабуть, знаходитесь у підпапці .git, перемістіться вгору на одну папку до кореня вашого проекту.


7
Найкраща відповідь, яку я бачив! Має бути прийнятою відповіддю.
GeertVc

Це найкраща відповідь. Я коли-небудь бачив. невеликий випуск. невеликий розчин. люблю це.
Ariful Islam

2
Чи є спосіб придушити це повідомлення?
roachsinai

19

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


1
Подібний досвід. У моєму випадку я використовував GitExtensions (для Windows), і намагаючись відкрити сховище, я натиснув, щоб відкрити файл .git замість папки, що містить. Спочатку виглядав добре, але дав мені помилку дерева, коли я почав щось робити.
удар

1
Мені подобається, що тут є десяток голосів. Я радий, що опублікував цю відповідь, хоча це здавалося явно очевидним.
Jacob Zimmerman


12

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

Приклад

Створити тимчасову папку:

mkdir temp

переключитися на тимчасову папку -

cd temp/

клонувати той самий проект у папці 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підпапці під коренем робочого дерева? Незважаючи на те, що це можливо, це, як правило, вимагає більшої роботи та більшої схильності до помилок користувачів.


Налаштування 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 .

видає помилку "fatal: ця операція повинна виконуватися в робочому дереві".

Ви також не можете перевірити це:

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

сподіваюся, це може допомогти вам


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 Bailey

Мені шкода, якщо я використаю "<>" для упаковки "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.baretrue, видаліть цей рядок конфігурації


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 . . .знову запустив і спробував успіх!


0

Те саме питання, яке я отримав, я зробив наступні кроки,

  1. git init
  2. git add.
  3. git commit -m "початкове налаштування"
  4. git push -f master master

тоді вона працює починає працювати.



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.