मेरा गिट रिपॉजिटरी गलत रूट डायरेक्टरी में है। क्या मैं इसे स्थानांतरित कर सकता हूं? (../ के बजाय ।/)


118

किसी तरह जब मैंने git initअपनी नवीनतम परियोजना को एक या एक महीने पहले संपादित किया था तो मैंने अपनी परियोजना की जड़ से अधिक एक निर्देशिका में कमांड को चलाया था।

तो मेरा भंडार ./projectनिर्देशिका में है न कि ./project/my-new-projectनिर्देशिका में। मुझे नहीं पता कि मुझे पहले इस मुद्दे का एहसास कैसे नहीं हुआ, लेकिन मैंने अभी तक .git निर्देशिका की तलाश नहीं की।

क्या कोई रास्ता है, मेरी परियोजना को मारे बिना, रिपॉजिटरी को उचित निर्देशिका में स्थानांतरित करने के लिए और फिर बताएं कि परियोजना का नया आधार क्या है? सिर्फ डायरेक्टरी हिलाने से काम नहीं चलता। Git को लगता है कि सभी फाइलें हटा दी गई हैं।

जवाबों:


19

संभवतः सबसे सरल बात, जब तक आप पहले से ही कुछ इतिहास नहीं बना लेते हैं जिसे आप सहेजना चाहते हैं, तो बस .gitउपनिर्देशिका को हटाना होगा और सही निर्देशिका में इनिट को फिर से करना होगा।

यदि आपने समस्या को हल करने के लिए गिट का उपयोग किया है, तो कोई भी समाधान आवश्यक रूप से बहुत सारी "इस फाइल को यहां ले जाया गया" इतिहास प्रविष्टियों को पीछे छोड़ देगा जो वास्तव में परिवर्तन नहीं हैं, लेकिन आप निर्माण समय पर एक स्क्रू को ठीक कर रहे हैं। इसे सही बनाने के लिए बेहतर है।


2
मैं देख रहा हूं कि आप क्या कह रहे हैं, लेकिन आप इसे सही करने के लिए जो भी कार्रवाई करते हैं, वह "इस फाइल को यहां ले जाया गया" का एक गुच्छा छोड़ देगा, जो वास्तव में परिवर्तन नहीं हैं, लेकिन आप सृजन समय पर एक स्क्रू को ठीक कर रहे हैं। इसे सही बनाने के लिए बेहतर है।
TED

8
इससे बहुत सारा सामान टूट जाता है। stackoverflow.com/a/3247756/825364 इसे करने का एक बेहतर तरीका है।
स्टीव तौबर

2
खैर, कुछ इतिहास को सहेजना Git के लिए उपयोग किया जाता है। हो सकता है कि हम सिर्फ .it उपनिर्देशिका को हटा दें और हमारे सिस्टम से Git की स्थापना रद्द करें? Vcs के बजाय एक ftp- सर्वर का उपयोग करना शायद सब से सरल बात है!
घर्मन

2
नीचे दिया गया उत्तर बहुत ही बेहतर तरीका है क्योंकि यह सभी इतिहास को बरकरार रखता है
BigMikeW

2
इसलिए मेरे लिए, मैंने ऐसा किया और तुरंत अपनी गलती का एहसास हुआ। किसी भी बदलाव के बारे में चिंता किए बिना, यह एक साफ स्लेट पर वापस जाने का सबसे आसान तरीका है।
माइक

261

मेरे सामने समस्या थी - मूल जड़ निर्देशिका (परियोजना / src से परियोजना के लिए) के लिए मेरे मूल आश्चर्य को स्थानांतरित करने के लिए, निम्न काम किया था !!

src$ mv .git ../ 
src$ cd ..
project$ git add src
project$ git commit -a

git ने बड़ी चतुराई से पता लगाया कि सभी नई फ़ाइलों को पुराने संस्करणों का नाम बदल दिया गया था और कोई इतिहास नहीं खो गया था

आप कुछ इसी तरह की कोशिश कर सकते हैं ... .गित फ़ोल्डर को स्थानांतरित करें और फ़ाइलों को कमिट करने से पहले फिर से जोड़ें


8
इसने मेरे लिए पूरी तरह से काम किया। मैंने अन्य .git * को भी फाइल को निर्देशिका से स्थानांतरित कर दिया जैसे .gitigore
Relequestual

7
मेरे प्रिय महोदय, आप एक जीवन रक्षक हैं। यह बात वास्तव में काम करती है। धन्यवाद।
रादु मर्ज़िया

1
इसके अतिरिक्त, मैं git rm'dउनके पुराने स्थान से फाइल करता हूं , इसलिए git status(सही ढंग से) कई नाम बदलने की कार्रवाई को समाप्त कर दिया। मैं जितने अधिक काम से काम करता हूं, मुझे उतना ही अच्छा लगता है।
ssc

7
@ इसे स्वीकार किए गए उत्तर के रूप में चिह्नित किया जाना चाहिए। यह फिर से शुरू करने के लिए एक पसंदीदा समाधान है क्योंकि आप इतिहास नहीं खोते हैं। यदि आप मुझ पर विश्वास नहीं करते हैं, तो अपवोट काउंट अपने लिए बोलता है।
जोसेफ

3
धन्यवाद! यह मेरे लिए काम करता है, लेकिन मुझे कुछ और चीजें करनी थीं: 1. कमिट करने से पहले, मैंने रूट फ़ोल्डर में अपडेट किया .gitignoreऔर भाग git add -Aगया; इसके बाद, git ने सभी फ़ाइलों को renamedइसके बजाय सही तरीके से दिखाया deleted। 2. चूंकि मैं सबमॉड्यूल्स का उपयोग करता हूं, इसलिए मुझे .gitmodulesनई रूट पर जाना पड़ा , और विभिन्न ग्राम कॉन्फ़िगरेशन फ़ाइलों में सबमॉड्यूल पथ को अपडेट करना पड़ा । यह पता लगाने के लिए कि मुझे कौन सी फाइलें संशोधित करनी हैंgrep -nrI --color 'old/path/to/submodule' .
गुइडो वाल्टर पेटिनारी

43

इसने मेरे लिए काम किया, और मेरे सारे इतिहास को अक्षुण्ण रखा। गलत रूट फोल्डर से (अभिभावक जहां आपने गलती से रेपो को इनिशियलाइज़ किया है):

फ़ोल्डर ले जाएँ:

mv .git thecorrectfolder/

गिट रेपो को पुनः आरंभ करें:

cd thecorrectfolder/
git init

सभी फ़ाइलें फिर से जोड़ें, कमिट करें, और पुश करें:

git add .
git commit -am 'fixing things'
git push origin master

किया हुआ! अपने आप को एक बियर प्राप्त करें।

जब आप पुन: प्रारंभ करने के बाद गिट रेपो बनाते हैं, तो आपको आउटपुट का एक गुच्छा मिलेगा जो इस तरह दिखता है:

rename {ethanode/coffee => coffee}/app.coffee (100%)

दूसरे शब्दों में, मूल फ़ोल्डर से आपके सभी संदर्भ और सही फ़ोल्डर का उपयोग करने के लिए नाम बदला जा रहा है।


धन्यवाद! यह तरीका ठीक वैसा ही था जैसा मुझे चाहिए था!
गियल बर्कर्स

यह मेरे लिए काम करता है, लेकिन यह थोड़ा बदसूरत था। जहाँ तक git की बात है, मैंने कुछ भी 'मूव' नहीं किया, मैंने सिर्फ सैकड़ों फाइलें हटाईं और फिर सैकड़ों अन्य, समान फाइलें जोड़ीं।
bjmc

6
git init की आवश्यकता नहीं है और शेष भाग मेरे उत्तर के समान है जो आपके द्वारा वर्षों पहले प्रस्तुत किया गया था: stackoverflow.com/a/3247756/391753
अभिषेक आनंद

35

git filter-branchआपको उस तरह से इतिहास को फिर से लिखने देता है। git filter-branchआदमी पेज भी अपने मामले है एक उदाहरण के रूप :

यह देखने के लिए भंडार को फिर से लिखना जैसे कि खाद्यान्न / इसकी परियोजना जड़ थी, और अन्य सभी इतिहास को छोड़ दें:

git filter-branch --subdirectory-filter foodir -- --all

आप शायद करना चाहते हैं git clone पहले (या बाद में) git filter-branchचलाने के लिए एक नए उपनिर्देशिका में रेपो हैं। (फ़िल्टर-शाखा से पहले क्लोनिंग और नए क्लोन पर फ़िल्टर-शाखा चलाने से .git/कुछ गलत होने पर बैकअप के रूप में मूल dir को छोड़ने का लाभ होगा ।)


1
यह "अन्य सभी इतिहास को नहीं छोड़ता " ( .gitरेपो को शीर्ष स्तर पर रखने का सुझाव देता है जबकि उपनिर्देशिका "रूट के रूप में सोचा जाता है") - यह शाब्दिक रूप से रेपो में अन्य सभी फाइलों को त्याग देगा, और सभी subdirectory/*फ़ाइलों को रूट फ़ोल्डर में ले जाएगा। ।
लुई मैडॉक्स

शानदार जवाब, लेकिन ध्यान रखें कि अगर एक .itignore फ़ाइल (यदि ट्रैक की गई है), तो यह इस ऑपरेशन के साथ खो जाएगी। इसके अलावा, आपको इसके git push --forceबाद अपस्ट्रीम रिपॉजिटरी को अपडेट करने के लिए एक करने की आवश्यकता होगी ।
15

12

Git अपने हैश के साथ फाइलों को याद रख सकता है,

बस अपने .gitरूट डायरेक्टरी में जाएं और विकल्प के gitसाथ सभी फाइलों में बदलाव को याद रखें --all

$ mv .git ../
$ cd ..
$ git add . --all 
$ git status // => you can see all the files recognized as renamed 100%
$ git commit -m "Moves repo to root directory."

3

git-mvअपनी फ़ाइलों को "ऊपर" उचित स्थान पर ले जाने के लिए उपयोग करें , फिर git-rm"मेरी-नई-परियोजना" निर्देशिका।


यह दूसरा तरीका है। मैं अपनी सभी फाइलों को डाइरेक्टरी git में नहीं ले जाना चाहता। इसमें (वहाँ अन्य सामान का टन है ... यह कष्टप्रद होगा) और फिर git को ऊपर ले जाएं। मैं अपनी परियोजना के मूल निर्देशिका तक भंडार को स्थानांतरित करना चाहता हूं।
माइक

2

मैं कहीं भी अपने भंडार को स्थानांतरित करने के लिए एक रास्ता खोज रहा था ।

मामले में, मैं केवल एक ही नहीं था, यहां मैंने अंत में क्या किया:

https://git.wiki.kernel.org/index.php/GitFaq#How_do_I_clone_a_repository_with_all_remotely_tracked_branches.3F I "git clone --mirror" दा नंगे मेरे रेपो की कॉपी और बाद में इसे नंगे नहीं होने के लिए बताया। उस नए फ़ोल्डर में। (फिर जाँच की गई कि फाइलें और लॉग दिखाई दिए हैं या नहीं।) पुराने रेपो को थोड़ी देर के लिए रखा, बस मामले में ...

इस तरह मैं इतिहास को खोए बिना अपने रेपो को स्थानांतरित करने में सक्षम था।

शुभकामनाएँ, दीना


अगर मैं गलत हूं तो मुझे सुधारें, लेकिन ऐसा प्रतीत होता है कि आप प्राप्त कर सकते हैं कि रिपॉजिटरी डायरेक्टरी को अपने निर्दिष्ट स्थान पर ले जाकर कुछ भी नहीं बल्कि नंगे फाइलसिस्टम टूल्स का उपयोग करके mv /path/to/the/old/location/of/the/repo /path/to/the/new/location/of/the/repo
क्यूई

2

बस इसी समस्या से गुज़रने के बाद मेरा अंतिम समाधान था:

  1. .Git फ़ोल्डर को उस स्थान पर ले जाएं जहां इसकी आवश्यकता है।
  2. निर्देशिका को उस फ़ोल्डर में बदलें जिसे मैंने अभी स्थानांतरित किया है
  3. फ़ोल्डर सामग्री को रीसेट करें कि क्या git को लगता है कि यह होना चाहिए: git reset --hard HEAD
  4. जांचें कि सामग्री मैच में है जो उन्हें kdiff3 या किसी अन्य तुलना उपकरण के साथ होना चाहिए
  5. पुराने स्थान पर अब अन-संस्करणित फ़ाइलों को हटा दें।

इसने जादू की तरह काम किया जिसका इतिहास पर कोई असर नहीं हुआ। - NB यदि आपने कुछ बदलाव किए हैं, तो .IT निर्देशिका के आगे बढ़ने से पहले उन्हें सुनिश्चित करें।


-3

यहाँ दो तरीके हैं:

  1. सीडी थ्रॉन्गडायरेक्ट्री आरएम -आरएफ .गित

  2. सिर्फ .ITET फ़ोल्डर और सही निर्देशिका के लिए सीडी DELETE।

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