मुझे संदेश क्यों मिल रहा है, "घातक: यह ऑपरेशन एक काम के पेड़ में चलाया जाना चाहिए?"


89

बस विंडोज पर गिट स्थापित। मैंने GIT_DIR वैरिएबल को c: \ git \ _ सेट किया और सत्यापित किया कि यह पर्यावरण वैरिएबल cygwin द्वारा बनाए रखा गया है (अर्थात $ 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 की तुलना में पूरी तरह से अलग अवधारणा है!
इन्नाएम

जवाबों:


55

त्रुटि का सीधा कारण यह है कि हां, git-addनंगे भंडार के साथ उपयोग करना असंभव है। परिभाषा के अनुसार, एक नंगे भंडार का कोई कार्य वृक्ष नहीं है। git-addकाम करने के लिए तैयारी में, काम के पेड़ से फाइलें लेता है और उन्हें सूचकांक में जोड़ता है।

आपको अपने सेटअप में थोड़ा विचार करने की आवश्यकता हो सकती है, हालाँकि। GIT_DIR सभी git कमांड के लिए रिपॉजिटरी डायरेक्टरी है। क्या आप वास्तव में आपके द्वारा ट्रैक की गई हर चीज के लिए एक एकल रिपॉजिटरी बनाने की कोशिश कर रहे हैं, शायद आपके सिस्टम में सभी चीजें? प्रकृति द्वारा एक गिट रिपॉजिटरी एक एकल निर्देशिका की सामग्री को ट्रैक करता है। आपको GIT_WORK_TREEएक ऐसा रास्ता तय करना होगा जिसमें आप जिस चीज को ट्रैक करना चाहते हैं, और फिर आपको .gitignoreट्रैकिंग में दिलचस्पी नहीं रखने वाली हर चीज को ब्लॉक करने की आवश्यकता होगी ।

शायद आप एक रिपॉजिटरी बनाने की कोशिश कर रहे हैं जो सिर्फ ट्रैक करेगा c:\www? फिर आपको इसे अंदर रखना चाहिए c:\www(GIT_DIR सेट न करें)। यह आपके "मॉड्यूल" के शीर्ष-स्तरीय निर्देशिका के .IT निर्देशिका में भंडार के साथ, गिट का सामान्य उपयोग है।

जब तक आपके पास वास्तव में अच्छा कारण नहीं है, मैं काम करने के लिए पसंद करने के तरीके से चिपके रहने की सलाह दूंगा। यदि आपके पास ट्रैक करने के लिए कई चीजें हैं, तो आप शायद कई रिपॉजिटरी चाहते हैं!


10
1. हम बस '20 कमांड्स में एवरीडे जीआईटी' का अनुसरण कर रहे हैं और लाइनस टी द्वारा गिट-इनिट (1) मैनपेज (जो दुर्भाग्य से आउट-डेटेड हो सकता है?) 2. आपका पोस्ट केवल यह बताता है कि क्या गलत है लेकिन हमें नहीं देता है? इसके बारे में क्या करना है इसका सुराग

55
बस git config --unset core.bare
मथायस उरलिच्स

मेरा मुद्दा blj के जवाब से हल हो गया था लेकिन उस सबफ़ोल्डर के अंदर, git branchकमांड का उपयोग करके मैं शाखाओं को सूचीबद्ध करने में सक्षम था, फिर भी मैं ऐसा करने में सक्षम नहीं था git checkout -b feature22। क्या इसका मतलब यह है कि शाखाओं को सूचीबद्ध करने के लिए इसे काम करने वाले पेड़ की ज़रूरत नहीं है, लेकिन इसे जांचने के लिए?
हनी

206

इसके अलावा, आप शायद .it सबफ़ोल्डर के अंदर हैं, एक फ़ोल्डर को अपने प्रोजेक्ट रूट पर ले जाएं।


7
सबसे अच्छा जवाब मैंने देखा है! स्वीकृत उत्तर होना चाहिए।
GeertVc

यह सबसे अच्छा जवाब है। मैंने कभी देखा है। छोटा मुद्दा। छोटा समाधान। इसे प्यार करना।
अरफुल इस्लाम

2
क्या इस संदेश को दबाने का कोई तरीका है?
रोचसिनाई

19

बस मेरे साथ जो हुआ वह किसी और के साथ हो रहा है, मुझे यह कहने की आवश्यकता है: मैं अपनी परियोजना के भीतर अपनी .गित निर्देशिका में था जब मुझे यह त्रुटि मिल रही थी। मैंने खोज की और जवाब के लिए डांटा, लेकिन कुछ भी काम नहीं किया। मुझे केवल इतना करना था कि वह सही निर्देशिका में वापस आ जाए। मेरे लिए यह एक तरह का चेहरा था। मामले में वहाँ किसी और के रूप में मुझे के रूप में मूर्खतापूर्ण है, मुझे आशा है कि आप इस जवाब उपयोगी पाया।


1
इसी तरह का अनुभव। मेरे मामले में मैं GitExtensions (विंडोज़ के लिए) का उपयोग कर रहा था, और रिपॉजिटरी को खोलने की कोशिश में, मैं फ़ोल्डर के बजाय .गित फ़ाइल को खोलने के लिए क्लिक करूँगा। पहली बार में ठीक लग रहा था, लेकिन जब मुझे वास्तव में कुछ भी करना शुरू किया तो मुझे पेड़ की त्रुटि दी।
थंड

1
मैं प्यार करता हूँ कि यह एक दर्जन upvotes है। मुझे खुशी है कि मैंने यह जवाब पोस्ट किया, भले ही यह स्पष्ट लग रहा था।
याकूब ज़िमरमैन

13

यह इसे हल करना चाहिए:

git config --unset core.bare

5
यदि आप एक समाधान देते हैं। कृपया यह भी बताएं कि क्यों।
मैं

2
इससे मेरे लिए समस्या ठीक हो गई।
5

1
इसने मेरी मदद की। मुझे परवाह नहीं है :)
जर्दा पावेलेक

12

बस उसी प्रोजेक्ट को किसी अन्य फ़ोल्डर में क्लोन करें और .it / फ़ोल्डर को अपने प्रोजेक्ट में कॉपी करें ।

उदाहरण

अस्थायी फ़ोल्डर बनाएँ:

mkdir temp

अस्थायी फ़ोल्डर में स्विच करें

cd temp/

अस्थायी फ़ोल्डर में एक ही परियोजना क्लोन :

git clone [-b branchName] git@path_to_your_git_repository

अपने।

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

अपनी परियोजना पर जाएं और चलाएं git status

हटाने के अस्थायी फ़ोल्डर यदि आपका काम पूरा कर लें।

आशा है कि यह किसी की मदद करेगा


1
मुझे यह उपयोगी लगा, लेकिन मुझे यह कहना है कि पहली पंक्ति मुझे एहसास दिलाने के लिए पर्याप्त थी कि क्या गलत था। इसके बाकी हिस्सों ने वास्तव में मुझे थोड़ा भ्रमित किया। वैसे भी बहुत बहुत धन्यवाद :)
randombee

@randombee यह मेरे लिए काम किया। । । लेकिन क्यों? यह क्या करता है?
यतीर्थ अग्रवाल 13

8

GIT_DIRदिए गए डायरेक्टरी को git रिपॉजिटरी के रूप में उपयोग करने के लिए पर्यावरण चर बलों को स्पष्ट रूप से सेट करना । सामान्य उपयोग के दौरान इसकी आवश्यकता कभी नहीं होती है।

आपके उदाहरण में, क्योंकि एक निर्दिष्ट किया गया है GIT_DIRऔर इसका नाम नहीं है .git(अग्रणी बिंदु महत्वपूर्ण है) और आपने एक --work-treeविकल्प प्रदान नहीं किया है या GIT_WORK_TREEपर्यावरण चर सेट नहीं किया है, कि जब आप कहते हैं कि आप एक नंगे भंडार चाहते हैं git init

क्योंकि एक नंगे रिपॉजिटरी में कोई काम करने वाला पेड़ नहीं होता है, कमांड का एक बड़ा चयन नंगे रिपॉजिटरी के साथ कोई मतलब नहीं रखता है। git addबस एक है।

क्या कोई विशेष कारण है कि आपको अपने .gitपेड़ मरम्मत के लिए एक गैर-मानक स्थान का उपयोग करने की आवश्यकता है, बजाय कार्यशील पेड़ की जड़ के एक सबफ़ोल्डर में ? हालांकि यह व्यवस्था करना संभव है कि यह उपयोगकर्ता की गलतियों के लिए अधिक काम और अधिक उत्तरदायी हो।


GIT_WORK_TREE को सेट करना मेरे लिए इसे हल करता है। GIT_DIR का उपयोग करने का कारण यह है कि मैं अपनी वर्किंग कॉपी के लिए एक अलग git रेपो चाहता हूं जहां मेरा एक बैकग्राउंड टास्क है जो हर कुछ मिनटों में बस जोड़ता / जोड़ता है। यह प्रक्रिया GIT_DIR से .gitsave पर सेट करती है। मेरा वास्तविक रेपो कार्य .git में है। अब मेरे पास एक स्थानीय लाइव ट्रैकिंग रेपो है इसलिए मेरे पास सभी फाइलों के संस्करण हैं क्योंकि मैं उन्हें बदलता हूं।
15

6

एक नंगे जीआईटी भंडार बनाएँ

एक छोटा शेख़ी: git अपने आप में एक सामान्य नंगे भंडार बनाने में असमर्थ है। वास्तव में बेवकूफ।

सटीक होने के लिए, खाली रिपॉजिटरी को क्लोन करना संभव नहीं है। तो एक खाली भंडार एक बेकार भंडार है। वास्तव में, आप सामान्य रूप से एक खाली भंडार बनाते हैं और उसे तुरंत भर देते हैं:

git init
git add .

हालाँकि, जब आप नंगे रिपॉजिटरी बनाते हैं तो git ऐड संभव नहीं है:

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

आशा है कि इससे आपको मदद मिल सकती है


1
यह simpy असत्य है। आप एक नंगे रिपॉजिटरी बना सकते हैं और इसे क्लोन कर सकते हैं। भले ही यह सच था यह अभी भी सवाल का समाधान नहीं करता है। (उदा$ 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.
सीबी बेली

मुझे खेद है, अगर मैं "नंगे भंडार" के url या पथ को पैकेज करने के लिए "<>" का उपयोग करता हूं, तो यह अदृश्य होगा। और मैंने जो कुछ कहा वह वास्तव में उपयोगी है। मेरे पास परीक्षण और सत्यापन है।
user1329261

6

मेरे पास यह मुद्दा था, क्योंकि .git/configइसमें निहित था worktree = D:/git-repositories/OldName। मैंने अभी इसे बदल दिया हैworktree = D:/git-repositories/NewName

मुझे पता चला कि, क्योंकि मैंने git gui का उपयोग किया था , जिसमें एक अधिक विस्तृत त्रुटि संदेश दिखाया गया था:

git gui error


1
मैंने git bash का उपयोग किया और संदेश प्राप्त किया fatal: this operation must be run in a work tree। कॉन्फ़िगरेशन फ़ाइल को संशोधित करना मेरे लिए इसे निर्धारित करता है।
पॉवेलिपोवनन

4

मेरे मामले में, मैं अपने रेपो के लिए ".it" फ़ाइल के समान फ़ोल्डर में था। मुझे एक निर्देशिका स्तर ऊपर जाना था, इसे हल कर दिया।


2

यदि कुछ और काम नहीं लगता है, तो पथ को दोबारा जांचें git config core.worktree। यदि वह पथ आपकी कार्यशील निर्देशिका को इंगित नहीं करता है, तो आपको इसे अपडेट करने की आवश्यकता हो सकती है।

जिस तरह से मुझे यह त्रुटि मिली कि मैंने एक नेटवर्क ड्राइव पर एक जीआईटी रिपॉजिटरी बनाई। इसने एक कंप्यूटर पर ठीक काम किया लेकिन इस त्रुटि को दूसरे पर लौटा दिया। यह पता चला कि मुझे कंप्यूटर पर विंडोज ड्राइव लेटर में मैप किया गया था, जहां मैंने इसे बनाया था, लेकिन दूसरे कंप्यूटर पर नहीं, और Git ने वर्क ट्री को मैप किए गए पथ के रूप में सहेजा और UNC पथ को नहीं।


1

यदि कोई मौजूदा (गैर-नंगे) चेकआउट यह त्रुटि देना शुरू करता है, तो अपनी .it / config फ़ाइल की जाँच करें; अगर core.bareयह सच है, तो उस विन्यास रेखा को हटा दें


0

यदि उपरोक्त सामान्य तरीकों में से कोई भी आपकी मदद नहीं करता है, तो इस त्रुटि संदेश के नीचे कॉल ट्रेस देखें ( "fatal: This operation . . .") और स्क्रिप्ट और लाइन का पता लगाएं जो वास्तविक त्रुटि उठा रहा है। एक बार जब आप उस त्रुटि () कॉल का पता लगा लेते हैं, तो उसे अक्षम करें और देखें कि क्या आप जिस ऑपरेशन की कोशिश कर रहे हैं वह कुछ चेतावनियों / संदेशों के साथ भी पूरा हो रहा है - उन्हें अब तक अनदेखा करें। यदि ऐसा है, तो आखिरकार इसे पूरा करने के बाद ऑपरेशन के उस हिस्से का उल्लेख कर सकते हैं जो सफलतापूर्वक पूरा नहीं हुआ था। अब, इस भाग को अलग से लागू करें।

मेरे मामले में तर्क से ऊपर उठकर, मुझे यह त्रुटि संदेश "fatal: This operation . . ."मिल रहा था जब मैं Android-x86 कोड को प्राप्त करने की कोशिश कर रहा था repo sync . . .। और कॉल ट्रेस raise GitError("cannot initialize work tree")त्रुटि के रूप में दिखाया गया है () कॉल उपरोक्त त्रुटि संदेश का कारण बनता है ( "fatal: . . .")। तो, टिप्पणी की कि बाद GitError()में .repo/repo/project.py, repo sync . . .तीन परियोजनाओं है कि ठीक से समन्वयन नहीं किया गया के लिए जारी रखा और अंत में संकेत त्रुटि। मैंने अभी-अभी उनके *.gitफ़ोल्डरों को स्थानीय रूप से Android-x86 स्रोत के पेड़ से उनके संबंधित पथों से हटा दिया है और repo sync . . .फिर से सफलता का स्वाद चखा है!


0

एक ही मुद्दा मुझे मिला, मैंने निम्नलिखित कदम उठाए,

  1. गिट इनिट
  2. जोड़ देना।
  3. git कमिट-मी "इनिटल सेटअप"
  4. git पुश -f मूल गुरु

तब यह काम करना शुरू कर देता है।



0

इसके अतिरिक्त, जाहिरा तौर पर, यह त्रुटि तब होगी जब आप NTFS राम ड्राइव में क्लोन करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.