मैं एक नंगे गिट रिपॉजिटरी को एक सामान्य (इन-प्लेस) में कैसे बदल सकता हूं?


81

मेरे पास एक नंगे गिट रिपॉजिटरी है, लेकिन इसे एसएचएस (उपयोगकर्ता अनुभव की तरह एक फ़ाइल प्रबंधक में) पर अपनी सामग्री को एक्सेस करने और ब्राउज़ करने की आवश्यकता है।

मुझे लगता है मैं इसे क्लोन कर सकता है:

git clone -l <path_to_bare_repo> <new_normal_repo>

हालाँकि, मेरी रिपॉजिटरी आकार में लगभग 20GB है और मेरे पास इसे डुप्लिकेट करने के लिए जगह नहीं है। क्या नंगी रिपॉजिटरी को जगह में बदलने का एक तरीका है कि इसमें एक काम करने वाली कॉपी को खत्म कर दिया जाए?


5
अनटाइटेड लेकिन अगर आप नंगे रिपॉजिटरी के कंटेंट को एक .gitडायरेक्टरी में रखते हैं और bareइनफॉरमेशन को झूठा करने के लिए पैरामीटर सेट करते हैं , तो इसे एक रेगुलर रिपॉजिटरी की तरह व्यवहार करना चाहिए, जहाँ आप git checkoutअपनी फाइल प्राप्त कर सकते हैं ।
नौफल इब्राहिम

"आप अपनी सामग्री ब्राउज़ करें" से क्या मतलब है, इस पर निर्भर करते हुए, आप संभवतः वह सब कुछ कर सकते हैं जो आप एक नंगे रेपो में उपयोग करना चाहते हैं git showऔरgit cat-file
विलियम पुरसेल

संकेत के लिए धन्यवाद, उपयोगी। मुझे अनुभव की तरह एक अधिक फ़ाइल प्रबंधक की आवश्यकता है (प्रश्न संपादित)।
नी

यदि आपका फ़ाइल सिस्टम हार्ड लिंक का समर्थन करता है, और आप एक ही फाइल सिस्टम में क्लोन करते हैं, तो क्लोन -l कोई भी डिस्क स्थान नहीं लेता है क्योंकि यह सभी ऑब्जेक्ट्स को हार्ड-लिंक करता है। हालाँकि, आपको चेकआउट के लिए स्थान की आवश्यकता होगी, जैसा कि अन्य ने नोट किया है।
नील मेव्यू

1
यदि आपकी नंगे रिपॉजिटरी में 20GB डिस्क स्थान है, तो कार्यशील पेड़ को और कितना चाहिए? क्या आप वास्तव में है कि अधिक स्थान है?
ADTC

जवाबों:


113

नोट : मैंने इसे एक बहुत ही सरल 1-प्रतिबद्ध भंडार पर परीक्षण किया । इसे डबल-चेक करें, मैन पेज पढ़ें , और स्टैकऑवरफ्लो पर मिली सलाह का पालन करने से पहले हमेशा खुश रहें। (आप वापस, सही है?)

--bareएक गैर-नंगे के लिए एक भंडार में बदलने के लिए:

  1. .gitअपने रिपॉजिटरी के शीर्ष-स्तर में एक फ़ोल्डर बनाएं ।
  2. आपके द्वारा अभी बनाई गई रिपॉजिटरी मैनेजमेंट चीजों ( HEAD branches config description hooks info objects refsआदि) को स्थानांतरित करें .git
  3. git config --local --bool core.bare falseस्थानीय गिट-भंडार को गैर-नंगे में परिवर्तित करने के लिए चलाएं ।
  4. ( तामसे पापा द्वारा टिप्पणी के माध्यम से ) चरण # 3 के बाद आप देखेंगे कि आप शाखा में हैं master(या जो भी आपकी मुख्य शाखा है) और आपकी सभी फाइलें हटा दी गई हैं और हटाए जाने का मंचन किया गया है। यह सामान्य है। बस मैन्युअल रूप से चेकआउट करें master, या एक करें git reset --hard, और आप कर रहे हैं।
  5. (संकल्प मुद्दे पर द्वारा रिपोर्ट Royi ) संपादित .git/configपंक्ति जोड़कर फ़ाइल fetch = +refs/heads/*:refs/remotes/origin/*के बाद url = <...>में [remote "origin"]खंड। अन्यथा git fetchनहीं देखेंगे origin/masterऔर अन्य मूल की शाखाएं।

ये कदम इस सवाल की विपरीत दिशा में हैं , "गिट-नॉर्मल नॉर्म टू रिपॉजिटरी" - विशेष रूप से इस जवाब पर ध्यान दें , जिसमें कहा गया है कि उपरोक्त चरण (में, मुझे लगता है, या तो दिशा) एक करने से अलग है git-clone। सुनिश्चित नहीं है कि यह आपके लिए प्रासंगिक है, हालांकि, लेकिन आपने git cloneप्रश्न में उल्लेख किया है।


2
मैंने सब लिखा था, फिर भी जब मैं फाइलों को धक्का देता हूं तो वे दिखाई नहीं देते। यह क्या हो सकता है (मैं भी नजरअंदाज करने के लिए इनकार इनकार कर दिया)?
रॉय

धन्यवाद! मैं एक दिन काम में आया और मुझे अपना मुख्य रेपो मिला - जिसमें से मैंने कई कार्यस्थल कहीं और थे - खुद को "नंगे" होने के लिए रिपोर्ट कर रहा था। अन्य सभी कार्यस्थल ठीक थे। कोई अंदाजा नहीं था कि कैसे उलझा जाए लेकिन यह जवाब मिल गया और इसने शानदार काम किया।
davidbak

17

मेरा परिदृश्य थोड़ा अलग था:

उपाय:

  • उस सामग्री में एक नंगे रेपो क्लोन को एक .gitडायर में:
    git clone --bare https://github.com/user/project .git
  • इसे एक गैर-नंगे रेपो के रूप में चिह्नित करें:
    git config --local --bool core.bare false
  • सूचकांक (अन्यथा, उसका मानना है कि सब कुछ हटा दिया गया है, के बाद से एक रीसेट .git नंगे रेपो एक फ़ाइल 'शामिल नहीं है index'।)
    git reset HEAD -- .
    यही कारण है कि पुनर्स्थापित .git/index

मैंने प्रभावी रूप से एक नंगे रेपो को गैर-नंगे वाले में बदल दिया है, जबकि मुझे पहले मिली सामग्री को संरक्षित करना। वर्षों से मैं
जिस पूर्ण स्क्रिप्ट का उपयोग कर रहा हूं उसमें चरण शामिल हैं:

cd /path/to/current/worktree

# That creates a .git directly at the right place
git clone --bare /url/of/repo .git

# restore the link between the local repo and its upstream remote repo
git config --local --bool core.bare false
git config --local remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
git fetch origin
git branch -u origin/master master

# reset the index (not the working tree)
git reset HEAD -- .

लेकिन मैं स्वीकृत समाधान ( ADTC द्वारा जोड़ा गया सहायक git resetकदम के साथ ) को सरल करता हूं ।


यह भी ध्यान देने योग्य है कि अगर नंगे रिपॉजिटरी को अलग-अलग लाइन एंडिंग वाली मशीन पर बनाया गया था, तो आप इन चरणों को करने के बाद भी संशोधित फ़ाइलें देख सकते हैं। मेरा मानना ​​है कि यह सामान्य है; git लाइनफीड को ठीक करने की कोशिश कर रहा है। यकीन नहीं है कि क्यों।
जूनो वुड्स

तो आप मूल रूप से नंगे के रूप में एक GitHub रेपो क्लोन किया, गैर-नंगे पर स्विच किया, मैन्युअल रूप से अपने "गैर-रेपो" और रीसेट इंडेक्स से सभी फ़ाइल डाल दिया? यह केवल रेपो को गैर-नंगे के रूप में पहली जगह पर क्लोन करने से अलग कैसे है? गैर-नंगे क्लोन प्रक्रिया वैसे भी सभी फाइलों की जांच करेगी। और अगर आप वास्तव में चाहते हैं, तो आप केवल अपने "गैर-रेपो" से चेक आउट फ़ाइलों को बदल सकते हैं।
ADTC

@ADTC का लक्ष्य .gitकाम करने वाले पेड़ में एक सबफ़ोल्डर प्राप्त करना है (जिसे आप जानते हैं कि आपका रेपो है) शुरू में एक संग्रह (गैर-गिट) से बना है। मैं एक गैर-नंगे रेपो की जांच नहीं कर सकता था, क्योंकि मैं जिस फ़ोल्डर में चेकआउट कर रहा था वह खाली नहीं है। git clone --no-checkoutएक उप - फ़ोल्डर में गैर-नंगे करने से मुझे .gitएक स्तर ऊपर ले जाने के लिए मजबूर होना पड़ेगा । एक नंगे क्लोन करने से मुझे सीधे .gitसबफ़ोल्डर बनाने की अनुमति मिली जहां मैं चाहता था। आप यहां स्क्रिप्ट देख सकते हैं: github.com/VonC/compileEverything/blob/…
VonC

"मैं एक गैर-नंगे रेपो की जांच नहीं कर सकता था, क्योंकि मैं जिस फ़ोल्डर में चेकआउट कर रहा था वह खाली नहीं है।" आपका मतलब है कि आपके पास एक गैर-गिट काम करने वाला पेड़ है जिसमें परिवर्तन शामिल हैं जो अभी तक प्रतिबद्ध नहीं हैं, और आप इसे एक जीआईटी-सक्षम काम करने वाले पेड़ में परिवर्तित करने के बाद करने का इरादा रखते हैं? हाँ मुझे लगता है, यह इस तरह के उपयोग के मामले के लिए काम करता है। व्यक्तिगत रूप से, मैं एक खाली फ़ोल्डर में क्लोन करूंगा और पहले दो (बाहरी उपकरण का उपयोग करके) तुलना करूंगा। लेकिन वह सिर्फ मैं हूं।
ADTC

@ADTC नहीं: मैं नहीं "गैर Git काम कर पेड़ कि परिवर्तन जो अभी तक प्रतिबद्ध नहीं हैं" है। मैं कुछ भी करना नहीं चाहता। मेरे पास जो कुछ भी है वह रेपो का सटीक कार्य है: सब गायब है .git। मैं .gitएक नंगे क्लोन के माध्यम से प्राप्त करता हूं, मैं उस .gitफ़ोल्डर को एक गैर-नंगे में बदल देता हूं , और यह git resetमहसूस करने के लिए कि काम करने वाला पेड़ पहले से ही है। वास्तव में यही github.com/VonC/compileEverything/blob/… करता है।
वॉनसी

11

उत्तरों में जानकारी को सरल और संयोजित करने के लिए:

तीन अंतर हैं जो एक नंगे रेपो को एक सामान्य .गित फ़ोल्डर से अलग बनाते हैं:

  • core.bare config फाइल में सही पर सेट है
  • इंडेक्स फाइल और वर्किंग ट्री मौजूद नहीं है
  • "मूल" रिमोट के लिए एक डिफ़ॉल्ट रीस्पेक उत्पन्न नहीं होता है

तो, आप बस अपने नंगे रेपो को एक नए फ़ोल्डर के .it सबफ़ोल्डर में स्थानांतरित कर सकते हैं,

mkdir clone
mv bare.git clone/.git

कोर बदलें:

cd clone
git config --local --bool core.bare false

सामान्य रूप से समान डिफॉल्ट बनाने git fetchऔर git pushलेने के लिए एक डिफ़ॉल्ट मूल refspec जोड़ें :

git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

और इंडेक्स फाइल और वर्किंग ट्री जनरेट करें:

git checkout master

मैं फ़ाइलों को उत्पन्न करने के git checkoutबजाय सलाह देता हूं git reset, अगर यह गलती से गलत जगह पर टाइप हो जाता है।


10

मूल पोस्टर का प्रश्न चीजों को सरल तरीके से करने के लिए पर्याप्त स्थान नहीं होने के बारे में है। उन लोगों के लिए जिनके पास पर्याप्त स्थान है, उत्तर बहुत सरल है:

git clone foo.git foo

इससे बचने का कारण यह है कि जब रेपो बड़ा हो जाता है, तो गिट क्लोन कभी-कभी मर जाता है। मैं नंगे रेपो के rsync करना चाहते हैं तो इसे परिवर्तित करें।
श्रीधर सरनोबत

@ श्रीधरनारोबत, तो स्वीकृत उत्तर में वर्णित कार्यों को करने पर विचार करें: stackoverflow.com/a/10637882/377270 - मैंने यह एक-लाइन उत्तर यहाँ रखा है, ताकि पर्याप्त खाली स्थान वाले लोग चीजों को आसान तरीके से कर सकें।
sarnold

6

यदि आप डिस्कस्पेस पर कम हैं, तो एक सामान्य रिपॉजिटरी में कनवर्ट करके काम करने वाले पेड़ का विस्तार करना एक मुद्दा होगा, लेकिन आप इसे परिवर्तित किए बिना एक नंगे रेपो की सामग्री ब्राउज़ कर सकते हैं। git cat-file -p <commit-sha>जिस भी पेड़ को संदर्भित करता है, उसे देखने के लिए किसी भी प्रतिबद्ध पर उपयोग करें । git cat-file -p <blob-sha>बूँद द्वारा संदर्भित फ़ाइल की सामग्री को देखने के लिए उपयोग करें । git show <sha>:pathपथ पर बूँद की सामग्री को देखने के लिए जहां शा या तो कमिट या पेड़ है वहां का उपयोग करें ।


1
आप सही हैं, लेकिन मुझे इसे और अधिक आसानी से ब्राउज़ करने की आवश्यकता है (ssh पर फ़ाइल प्रबंधक में)। इस प्रकार मुझे बढ़ी हुई डिस्क स्थान के साथ रहने की आवश्यकता होगी।
नी

1
दरअसल, यह एक वास्तविक मुद्दा (+1) है। कार्यशील पेड़ अक्सर डिस्क स्थान के आधे हिस्से का उपभोग करते हैं; आंशिक रूप से क्योंकि git इतिहास आक्रामक रूप से संकुचित है।
jpaugh

4

cd नंगे रेपो और करो में

  1. या तो:
git config core.bare false
git reset --hard
  1. या
git clone X.git X

(एक्स नाम दिया गया है कि आप नियमित रूप से git रेपो देंगे)


यह सबसे सरल समाधान है और मैं 2019 में पुष्टि कर सकता हूं कि यह काम करता है (पहला दृष्टिकोण)।
श्रीधर सरनोबत

बस एक छोटा सा नोट मैं भूल गया (सभी उत्तरों पर लागू): आपको दूरस्थ यूआरएल सेट करने के लिए पहली बार पुश करने पर आपको कॉन्फिग फाइल को एडिट करना होगा।
श्रीधर सरनोबत

2

अगर आपको अलग-अलग वर्कट्री पर काम करने का मन नहीं है, तो

git worktree add ../repo2
cd ..
git status # now works fine

कृपया ध्यान दें, यह क्लोन नहीं है।


यह बहुत अच्छा है, यह निश्चित नहीं है कि यह सूची में ऊपर क्यों नहीं है
निकोलई

0

पुश-टू-डिप्लॉय

नंगे रिमोट को मानक रिपॉजिटरी में बदलने के बजाय, आप रिपॉजिटरी को एक परिनियोजन निर्देशिका में विस्तारित करने के लिए हुक निर्देशिका में पोस्ट-प्राप्त स्क्रिप्ट का उपयोग कर सकते हैं।

यहां पुश-टू-डिप्लो स्थापित करने का एक अच्छा उदाहरण है

संदर्भ में आसानी के लिए, यह उपरोक्त लिंक से स्क्रिप्ट सामग्री उदाहरण है। यह केवल "मास्टर" शाखा से "परिनियोजित" नामक एक निर्देशिका में धकेलता है, जो कि रिपॉजिटरी की मूल निर्देशिका के समान स्तर पर है:

#!/usr/bin/env ruby
# post-receive

# 1. Read STDIN (Format: "from_commit to_commit branch_name")
from, to, branch = ARGF.read.split " "

# 2. Only deploy if master branch was pushed
if (branch =~ /master$/) == nil
    puts "Received branch #{branch}, not deploying."
    exit
end

# 3. Copy files to deploy directory
deploy_to_dir = File.expand_path('../deploy')
`GIT_WORK_TREE="#{deploy_to_dir}" git checkout -f master`
puts "DEPLOY: master(#{to}) copied to '#{deploy_to_dir}'"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.