मौजूदा फ़ोल्डर में "git क्लोन" के लिए सबसे अच्छा अभ्यास क्या है?


479

मेरे पास परियोजना की एक कार्यशील प्रतिलिपि है, बिना किसी स्रोत नियंत्रण मेटा डेटा के। अब, मैं इस फ़ोल्डर में git-क्लोन के बराबर काम करना चाहूंगा, और अपने स्थानीय परिवर्तन रखूंगा।

git-clone मुझे किसी मौजूदा फ़ोल्डर में क्लोन करने की अनुमति नहीं देता है। यहां सबसे अच्छा अभ्यास क्या है?


4
बेहतर चर्चा यहाँ है
cdunn2001

1
@ मुझे यह उत्तर अधिक पसंद है, लेकिन या तो काम करता है ... stackoverflow.com/a/5377989/11236
ripper234

2
@ ripper234 - हाँ। मैं एक ही स्थिति पर था और मैंने सिर्फ वे कदम उठाए, और कोई समस्या नहीं हुई। सब साफ और अच्छा। मुझे लगता है कि यह वरीयता की बात है, नीचे की रेखा है, कि दोनों काम करते हैं, जैसा कि आप राज्य करते हैं। चीयर्स।
मेम

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

जवाबों:


557

यह एक नई निर्देशिका के लिए क्लोनिंग द्वारा किया जा सकता है, फिर .gitनिर्देशिका को अपनी मौजूदा निर्देशिका में स्थानांतरित कर सकता है ।

यदि आपकी मौजूदा निर्देशिका को "कोड" नाम दिया गया है।

git clone https://myrepo.com/git.git temp
mv temp/.git code/.git
rm -rf temp

यह क्लोन कमांड के दौरान चेकआउट किए बिना भी किया जा सकता है; अधिक जानकारी यहां पाई जा सकती है


25
ध्यान दें कि यह ठीक @ChrisJohnsen का सुझाव है जिसे उन्होंने टिप्पणियों में छोड़ा है। मैंने इसे उपयोगी पाया और इसे वास्तविक उत्तर में बनाना चाहता था। क्रिस, यदि आप एक उत्तर देना समाप्त करते हैं, तो मैं खुशी से इस एक को हटा दूंगा।
amicitas

2
धन्यवाद! हालांकि यह एक कदम याद आ रहा है जैसे "git checkout -।" जैसा कि यह सोचता है कि सभी फाइलें हटा दी गई हैं, है ना?
मैरोनी

2
नहीं, जब तक आप git cloneपहली कमांड के रूप में उपयोग करते हैं , तब तक कोई और चेकआउट कमांड आवश्यक नहीं है। यदि आप इसके बजाय कुछ का उपयोग करते हैंgit clone --no-checkout उस पहले चरण में , तो .it निर्देशिका को स्थानांतरित करने के बाद git reset HEADगिट को बताने के लिए उपयोग करना आवश्यक होगा कि फ़ाइलों को हटाया नहीं गया है।
amicitas

3
मैं इसे तीसरे चरण के रूप में जोड़ूंगा: एमवी टेम्प / / .ignignore कोड / .ignignore
डैनियल अरंडा

1
@ KalpeshSoni, Yes git को संशोधित फ़ाइलों के बारे में पता होगा और सामान्य git कमांड जैसे कि सामान्य बदलावों का उपयोग करना संभव होगा git status
अमिक्टास

284

इसके बजाय, क्लोन न करें। रेपो में:

git init
git remote add origin $url_of_clone_source
git fetch origin
git checkout -b master --track origin/master # origin/master is clone's default

फिर आप जिस पेड़ को चाहते हैं उसे प्राप्त करने के लिए पेड़ को रीसेट कर सकते हैं:

git reset origin/master # or whatever commit you think is proper...

और तुम ऐसे हो जैसे तुमने क्लोन किया है।

यहां दिलचस्प सवाल (और जवाब के बिना एक): कैसे पता लगाएं कि आपका नग्न पेड़ किस पर आधारित है, इसलिए किस स्थिति में रीसेट करना है।


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

5
'git चेकआउट -ट्रैक ओरिजिन / मास्टर' भी 'git checkout -b master --track origin / master' के बजाय अच्छी तरह से काम करता है। रीसेट की आवश्यकता नहीं है।
felipecrp

1
मुझे यह त्रुटि मिल रही थी "Git त्रुटि: निम्नलिखित अनियोजित कार्यशील ट्री फाइलें चेकआउट द्वारा अधिलेखित हो जाएंगी", इसलिए मैं इस कमांड को जोड़ता हूं: git clean -d -fx ""
shakaran

1
निश्चित रूप से सभी स्थितियों में उचित नहीं है, लेकिन यह वही है जो मुझे चाहिए था।
चैम एलियाह

1
@AndreasKrey आपका मूल उत्तर (जो मैं देखने के लिए संपादित इतिहास में गया था) वही करता है जो प्रश्न (और मेरे) द्वारा आवश्यक है। -उपयोग का उपयोग किए बिना चेकआउट में बदला हुआ उत्तर बारफ्स, जो स्थानीय परिवर्तनों को त्यागता है और वास्तव में वही है जो मैं नहीं चाहता। अगर मैं आप होता तो मैं आपके मूल उत्तर पर वापस जाने पर विचार करता।
अजान

77

निम्नलिखित मैंने मौजूदा निर्देशिका में मास्टर शाखा की जाँच करने के लिए किया:

git init
git remote add origin [my-repo]
git fetch
git checkout origin/master -ft

2
यह एक शानदार उत्तर है और किसी भी फाइल सिस्टम को खत्म होने से बचा लेता है।
user151841

1
यह स्वीकृत उत्तर होना चाहिए क्योंकि यह हैक नहीं है।
php_nub_qq

5
वास्तव में यह वही है जो ओपी (और मुझे) नहीं चाहिए, जो स्थानीय परिवर्तनों को अधिलेखित करना है।
अजीन

मेरा उत्थान इंगित करता है कि इससे मुझे मदद मिली, न कि यह ओपी के सवाल का सबसे अच्छा जवाब है।
टेकब्रैट

2
क्या कोई समझा सकता है कि -tयहाँ ध्वज का उपयोग क्यों किया जाता है?
jfowkes

38

मैं git cloneएक नई निर्देशिका में जाऊँगा और मौजूदा निर्देशिका की सामग्री को नए क्लोन में कॉपी करूँगा ।


4
यदि आप ऐसा करते हैं, तो सुनिश्चित करें कि आप बहुत सावधानी से करने से पहले फॉर्म की समीक्षा करें - यह एक पूर्ण क्लासिक मामला है जहां आप गलती से उन परिवर्तनों को वापस कर सकते हैं जो जब भी आपको अपनी कार्यशील प्रति मिली, तब से स्रोत रेपो में किए गए थे - क्योंकि पर्याप्त जानकारी नहीं है रेपो में किए गए अन्य परिवर्तनों के साथ विलय करने से पहले यह पता लगाने के लिए कि आप क्या बदलाव कर रहे हैं बनाम क्या है, यह जानने के लिए आप क्या कर रहे हैं। मैंने इस स्थिति में समय और समय फिर से देखा है, उस बिंदु तक जहां मैंने खुद को "दृढ़ता से हतोत्साहित" किया और जिन लोगों के साथ मैंने कभी काम किया।
बेन क्लिफर्ड

72
git clone wherever tmp && git mv tmp/.git . && rm -rf tmpदूसरे शब्दों में, .gitएक अस्थायी क्लोन से डायर को स्थानांतरित करना क्लोन के काम के पेड़ को साफ करने और वहां मौजूद फाइलों को कॉपी करने की तुलना में सरल लगता है।
क्रिस जॉन्सन

1
@ क्रिसहॉन्सेन: आपको इसे एक उत्तर में बनाना चाहिए था, यह निश्चित रूप से इसे करने का सबसे अच्छा तरीका है
स्टीफनो

2
@ChrisJohnsen मेरे लिए git mv tmp/.git .लौटता fatal: cannot move directory over file, source=tmp/.git, destination=.gitहै। किसी को पता है कि मुद्दा क्या है?
डेनिस

6
@ डेनिस, यह एक टाइपो है: यह आदेश सादा होना चाहिए mv, नहीं git mv; हालाँकि यह स्पष्ट नहीं करता है कि आपके पास .gitपहले से ही एक फ़ाइल क्यों है (युक्त gitdir: some/path/to/a/git-dir, "gitfile"; यदि यह वहाँ नहीं होता, तो आप fatal: Not a git repository (or any of the parent directories): .gitइसके बजाय देखते)।
क्रिस जॉन्सन

34

एक अस्थायी निर्देशिका का उपयोग करना ठीक है, लेकिन यदि आप उस चरण से बचना चाहते हैं तो यह काम करेगा। अपनी कार्यशील निर्देशिका की जड़ से:

$ rm -fr .git
$ git init
$ git remote add origin your-git-url
$ git fetch
$ git reset --mixed origin/master

20
git reset --hard origin/masterकिसी भी स्थानीय फाइल को हटा देगा।
मौद देबबर

1
क्या पहले से ही ऊपर बताया गया है के बीच अंतर को जोड़ने के लिए, hardऔर mixedहै कि मिश्रित स्थानीय परिवर्तन रखेंगे है (इसलिए यदि आप बाद में खींचने के लिए यह आप जैसे दिखाता हूँ कोशिश रिबेस साथ खींच नहीं कर सकता:। आप unstaged परिवर्तन के लिए प्रतिबद्ध हैं या उन्हें छिपाया कृपया ) , जबकि हार्ड उन स्थानीय परिवर्तनों को त्याग देगा
aexl

आपने गलत वर्तनी लिखी है।
ग्लेन डेटन

10
git clone your_repo tmp && mv tmp/.git . && rm -rf tmp && git reset --mixed

7
उपयोग git reset --hardकरने से स्थानीय फ़ाइल में बदलाव आएगा, विशेष रूप से इस ओपी ने अनुरोध नहीं किया। --mixedइसके बजाय उपयोग किया जाना चाहिए।
कालेब

4

खाली मौजूदा निर्देशिका में एक git रेपो क्लोन करने के लिए निम्न कार्य करें:

cd myfolder
git clone https://myrepo.com/git.git . 

.अपने git cloneकमांड के अंत में सूचना दें । यह रेपो को वर्तमान कार्यशील निर्देशिका में डाउनलोड करेगा।


4
fatal: destination path '.' already exists and is not an empty directory.
रोलैंड कोफ्लर

निर्देशिका खाली होनी चाहिए।
OKTalk

4
ओपी एक मौजूदा परियोजना में क्लोन करने के लिए कह रहा है, जिसमें कहा गया है कि गिट क्लोन शिकायत करता है। बुरा जवाब।
मिश्रण 3 डी

यह तभी काम करता है जब आप नई निर्देशिका बनाते हैं, "git init" का उपयोग किए बिना उपरोक्त कमांड चलाते हैं
बिलाल अहमद

3

जवाब के बहुत पहले से ही यह उस तरह से करने के लिए जिस तरह से ओपी ने पूछा। लेकिन यह ध्यान देने योग्य है कि इसे विपरीत तरीके से करना कहीं अधिक सरल है:

git clone repo-url tmp/
cp -R working/ tmp/

अब आपके पास वांछित लक्ष्य स्थिति है - ताजा क्लोन + स्थानीय-परिवर्तन।


2

इसके लिए दो दृष्टिकोण हैं। जहां संभव हो मैं आपके नए गिट वर्किंग डायरेक्टरी के लिए एक साफ फ़ोल्डर के साथ शुरू करूंगा और फिर बाद में आपके संस्करण की नकल करूंगा। यह कुछ इस तरह लग सकता है *:

mv $dir $dir.orig
git clone $url $dir
rsync -av --delete --exclude '.git' $dir.orig/ $dir/
rm -rf $dir.orig

इस बिंदु पर आपके पास वर्तमान कार्यशील निर्देशिका के रूप में आपके पिछले काम करने वाले फ़ोल्डर के साथ एक बहुत ही साफ-सुथरी काम करने वाली प्रति होनी चाहिए ताकि कोई भी परिवर्तन शामिल हो तो फ़ाइल विलोपन रडार पर दिखाई देगा यदि आप चलाते हैं git status

दूसरी ओर यदि आप वास्तव में इसे दूसरे तरीके से करना चाहते हैं, तो आप कुछ इस तरह से परिणाम प्राप्त कर सकते हैं:

cd $dir
git clone --no-checkout $url tempdir
mv tempdir/.git .
rmdir tempdir
git reset --mixed HEAD

किसी भी तरह से, पहली चीज जो मैं करूंगा, वह है कि git stashआपके द्वारा स्थापित सभी स्थानीय परिवर्तनों की एक प्रति प्राप्त करना पसंद है, तो आप उन्हें फिर से लागू कर सकते हैं और वे काम कर सकते हैं जिनके माध्यम से आप प्रतिबद्ध होना चाहते हैं।

* दोनों उदाहरण मानते हैं कि आप अपने प्रोजेक्ट की मूल निर्देशिका में शेल पर शुरू करते हैं।


2

यह उन सभी तरीकों में से सर्वश्रेष्ठ है, जो मैंने पूरे किए

existing-dirएक खाली अस्थायी निर्देशिका में सिर्फ रिपॉजिटरी के .git फ़ोल्डर (फ़ाइलों को छोड़कर वे पहले से ही हैं ) को क्लोन करें

  1. git clone --no-checkout repo-path-to-clone existing-dir/existing-dir.tmp // चाहते हो सकता है - स्थानीय रेपो क्लोनिंग के लिए कोई हार्डलिंक नहीं

फ़ाइलों के साथ .IT फ़ोल्डर को निर्देशिका में ले जाएं। इससे existing-dirगिट रेपो बनता है।

  1. mv existing-dir/existing-dir.tmp/.git existing-dir/

अस्थायी निर्देशिका हटाएं

  1. rmdir existing-dir/existing-dir.tmp

  2. cd existing-dir

Git को लगता है कि सभी फाइलें हटा दी गई हैं, यह रेपो की स्थिति को HEAD में बदल देता है।

चेतावनी: फ़ाइलों में कोई भी स्थानीय परिवर्तन खो जाएगा।

  1. git reset --mixed HEAD

1
99% मामलों में एक हार्ड रीसेट अवांछित लगता है, जहाँ आपको ऐसा करने की आवश्यकता होगी।
स्टीफन फेबियन

0

यदि आप कम से कम git 1.7.7 (जो विकल्प सिखाया cloneगया --configहै) का उपयोग कर रहे हैं , तो वर्तमान निर्देशिका को कार्यशील प्रतिलिपि में बदलने के लिए:

git clone example.com/my.git ./.git --mirror --config core.bare=false

यह काम करता है:

  • एक नए .gitफ़ोल्डर में रिपॉजिटरी को क्लोन करना
  • --mirrorनए क्लोन को विशुद्ध रूप से मेटाडेटा फ़ोल्डर में बनाता है जैसा .gitकि होना चाहिए
  • --config core.bare=falseविकल्प के निहितार्थ bare=trueका प्रतिकार करता --mirrorहै, जिससे रिपॉजिटरी को एक संबद्ध वर्किंग डायरेक्टरी रखने और सामान्य क्लोन की तरह काम करने की अनुमति मिलती है

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


1
ध्यान दें कि इस तकनीक का परिणाम [core]स्थानीय कॉन्फ़िगरेशन के अनुभाग में होगा, जिसमें दोनों शामिल हैं bare = true और bare = false । अधिक समस्याग्रस्त यह है कि इसमें originरिमोट के लिए गलत मान होंगे , जिसमें [remote "origin"]अनुभाग भी शामिल है mirror = trueऔर एक भ्रूण की कल्पना है जो काम की प्रतिलिपि के साथ ठीक से काम नहीं करेगा। इन मुद्दों को ठीक करने के बाद, सामान्य रूप से क्लोनिंग और नई कार्य प्रतिलिपि की गति .gitअधिक कुशल होगी।
अरक्सिया

0

आमतौर पर मैं शुरुआती रिपॉजिटरी को क्लोन करूंगा, और फिर मौजूदा फ़ोल्डर में सब कुछ प्रारंभिक रिपॉजिटरी में स्थानांतरित कर दूंगा। यह हर बार काम करता है।

इस पद्धति का लाभ यह है कि आप README या .gitignore सहित प्रारंभिक रिपॉजिटरी में से कुछ भी गायब नहीं करेंगे।

आप चरण समाप्त करने के लिए नीचे दिए गए आदेश का भी उपयोग कर सकते हैं:

$ git clone https://github.com/your_repo.git && mv existing_folder/* your_repo

0

आप निम्न कमांड लाइनों को पुनरावर्ती रूप से टाइप करके कर सकते हैं:

mkdir temp_dir   //  Create new temporary dicetory named temp_dir
git clone https://www...........git temp_dir // Clone your git repo inside it
mv temp_dir/* existing_dir // Move the recently cloned repo content from the temp_dir to your existing_dir
rm -rf temp_dir // Remove the created temporary directory

0

बस का उपयोग करें। git cloneकमांड के अंत में (उस निर्देशिका में), इस तरह से:

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