मैं एक गैर-रिक्त निर्देशिका में कैसे क्लोन कर सकता हूं?


572

मेरे पास निर्देशिका ए है, जो कि फाइलिंग डायरेक्टरी बी के साथ है। निर्देशिका ए में अन्य आवश्यक फाइलें हो सकती हैं। डायरेक्टरी B एक git रेपो है।

मैं निर्देशिका B को निर्देशिका A में क्लोन करना चाहता हूं, लेकिन git-clone मुझे अनुमति नहीं देगा क्योंकि निर्देशिका गैर-रिक्त है।

मैं उम्मीद कर रहा था कि यह सिर्फ क्लोन होगा। क्योंकि सभी फाइलें मेल खाती हैं और मैं वहां से जा सकता हूं?

मैं एक खाली निर्देशिका में क्लोन नहीं कर सकता क्योंकि मेरे पास निर्देशिका ए में फाइलें हैं जो निर्देशिका बी में नहीं हैं और मैं उन्हें रखना चाहता हूं।

कॉपी करना। यह एक विकल्प नहीं है क्योंकि मैं चाहता हूं कि मैं इसके साथ धक्का / खींचूं और मैं उन्हें मैन्युअल रूप से सेट नहीं करना चाहता।

क्या इसे करने का कोई तरीका है?

अद्यतन: मुझे लगता है कि यह काम करता है, क्या कोई भी समस्या देख सकता है? ->

cd a
git clone --no-hardlinks --no-checkout ../b a.tmp 
mv a.tmp/.git .
rm -rf a.tmp
git unstage # apparently git thinks all the files are deleted if you don't do this

5
शायद आप स्वीकृत उत्तर को बदल सकते हैं?
बस्तियान क्वैस्ट

जवाबों:


724

यह मेरे लिए काम किया:

git init
git remote add origin PATH/TO/REPO
git fetch
git reset origin/master  # Required when the versioned files existed in path before "git init" of this repo.
git checkout -t origin/master

नोट: -t यदि आप चाहते हैं कि, और यह आमतौर पर है, तो आप के लिए अपस्ट्रीम शाखा सेट करेगा।


70
यह गैर-खाली निर्देशिका में काम नहीं करता है जब आने वाली फाइलें पहले से मौजूद हैं (जैसा कि मूल प्रश्न का वर्णन है)। लेकिन अगर आप के git reset origin/masterबाद git fetch, यह काम करेगा (किसी भी स्थानीय परिवर्तन को संरक्षित भी)।
आराक्सिया

8
घातक: एक ही समय में पथ को अपडेट नहीं कर सकता और शाखा 'मास्टर' पर स्विच कर सकता है।
अर्नोल्ड रोआ

7
यह जवाब मेरे लिए काम नहीं करता है। जब मैं git checkout ...शिकायत करता हूं कि मेरी सभी फाइलें अधिलेखित हो जाएंगी और मुझे उन्हें पहले स्थानांतरित करना चाहिए। जब मैं `git रीसेट मूल / मास्टर /` करता हूं, तो पहले चेकआउट कमांड से शिकायत होती है कि मास्टर नामक एक शाखा पहले से मौजूद है।
सस्किया

4
git checkout masterमेरे लिए एक पर्याप्त अंतिम कदम था।
योयो

16
सभी चरणों ने पूरी तरह से काम किया, लेकिन आखिरी मुझे मिला fatal: A branch named 'master' already exists:। मुझे लगता है कि मुझे वास्तव में इसकी आवश्यकता नहीं थी।
Shadi

164

निम्नलिखित शेल कमांड existing-dirमें एक डायरेक्टरी है, जिसकी सामग्री repo-to-cloneगिट रिपॉजिटरी में ट्रैक की गई फाइलों से मेल खाती है।

# Clone just the repository's .git folder (excluding files as they are already in
# `existing-dir`) into an empty temporary directory
git clone --no-checkout repo-to-clone existing-dir/existing-dir.tmp # might want --no-hardlinks for cloning local repo

# Move the .git folder to the directory with the files.
# This makes `existing-dir` a git repo.
mv existing-dir/existing-dir.tmp/.git existing-dir/

# Delete the temporary directory
rmdir existing-dir/existing-dir.tmp
cd existing-dir

# git thinks all files are deleted, this reverts the state of the repo to HEAD.
# WARNING: any local changes to the files will be lost.
git reset --hard HEAD

5
मुझे करने की ज़रूरत थी git reset --hard HEADया यह "हटाए गए" फाइलों पर नहीं देना होगा।
दिमित्र

18
git reset HEADमेरे लिए ठीक काम किया। git reset --hard HEADआपकी फ़ाइलों में किसी भी परिवर्तन को नष्ट कर देता है, इसलिए यदि वे भंडार में फ़ाइलों के समान नहीं हैं, तो आपको ऐसा नहीं करना चाहिए।
TGR

1
git reset HEADलगता है मेरे लिए कोई प्रभाव नहीं है। git reset --hard HEADकरता है - लेकिन वह आपके द्वारा फ़ाइलों में किए गए किसी भी परिवर्तन को खो देता है। क्या कोई बेहतर समाधान है?
जैकब डोरमैन

1
@ केसी का जवाब - गिट इनिट / रिमोट ऐड / भ्रूण / चेकआउट - क्लीनर और सरल है और इसके लिए किसी अस्थायी फ़ोल्डर की आवश्यकता नहीं है।
योयो

1
@ केसी का जवाब मेरे लिए तब काम नहीं आया जब पहले से ही फ़ोल्डर्स में ऐसी फाइलें थीं, जिन्हें बने रहने की जरूरत थी, लेकिन वो git repo में नहीं थी। यह स्थापित स्क्रिप्ट्स चलाने के बाद कॉन्फ़िगर करने के लिए उपयोगी है जहां फाइलें और निर्देशिकाएं बनाई जाती हैं, लेकिन आपको स्थापित आइटमों के शीर्ष पर फ़ाइलों को अपडेट / जोड़ने की आवश्यकता होती है।
15

104

मेरे लिए काम करने वाले उत्तरों में से एक में थोड़ा सा संशोधन:

git init
git remote add origin PATH/TO/REPO
git pull origin master

सीधे मास्टर शाखा पर काम करना शुरू करें।


1
Gitignore में निर्दिष्ट अप्रासंगिक फ़ाइलों को हटाने के बिना, गंदे मौजूदा निर्देशिका को साफ करने के लिए HEAD --hard को रीसेट करना था
Ray Foss

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

4
यह एक गिट-क्लोन के बराबर नहीं है - जो गायब है वह मास्टर शाखा के लिए अपस्ट्रीम जानकारी है। इसे जोड़कर तय किया जा सकता है git branch --set-upstream-to=origin/master master
स्लावेन रेज़िक

इस संस्करण ने मेरे लिए काम किया, बस एक रीसेट रीसेट करना था
HAD

28

चेतावनी - यह संभावित रूप से फाइलों को अधिलेखित कर सकता है।

git init     
git remote add origin PATH/TO/REPO     
git fetch     
git checkout -t origin/master -f

@ Cmcginty के जवाब से संशोधित - अगर यह मेरे लिए काम नहीं करता है


निश्चित रूप से आपको इसके बाद सभी फ़ाइलों की जांच करने की आवश्यकता है git checkout .?
क्रिस Stryczynski

25

यहाँ है कि मैं क्या कर रहा था जब मुझे वही समस्या थी (कम से कम मुझे लगता है कि यह वही समस्या है)। मैं निर्देशिका ए में चला गया और भाग गयाgit init

चूँकि मैं चाहता था कि निर्देशिका A में फ़ाइलों को git द्वारा अनुसरण किया जाए, मैंने .gitignore को संपादित किया और उसमें मौजूदा फ़ाइलों को जोड़ा। इसके बाद मैंने git remote add origin '<url>' && git pull origin masterएट वॉयला चलाया, बी को एक हिचकी के बिना ए में "क्लोन" किया गया।


2
यह तकनीक एक गैर-खाली निर्देशिका में काम नहीं करती है जब आने वाली फाइलें पहले से मौजूद होती हैं (जैसा कि मूल प्रश्न का वर्णन है)।
आराक्सिया

11

मैंने कुछ समय पहले इसका उपयोग किया है, कम से कम संभावित विनाशकारी आदेशों की आवश्यकता है:

cd existing-dir
git clone --bare repo-to-clone .git
git config --unset core.bare
git remote rm origin
git remote add origin repo-to-clone
git reset

और वोइला!


10

एक और सरल नुस्खा मेरे लिए अच्छा काम करता है:

git clone --bare $URL .git
git config core.bare false

मौजूदा फ़ाइलों के साथ एक निर्देशिका की जाँच करने के लिए मेरा मुख्य उपयोग मामला Git के साथ मेरी यूनिक्स डॉटफाइल्स को नियंत्रित करने के लिए है। एक नए खाते पर, होम निर्देशिका में पहले से ही कुछ फाइलें होंगी, संभवतः वे भी जिन्हें मैं Git से प्राप्त करना चाहता हूं।


1
न तो रिपॉजिटरी की स्थापना कुछ अलग तरीके से होती है और जब यह काम करता है तो मैं इसकी सिफारिश नहीं करता। :)
थोरसुमोनर

1
क्या आप अधिक विशिष्ट हो सकते हैं? क्या अंतर है?
केन विलियम्स

1
केवल दो अंतर: 1.) .git/configफ़ाइल इंगित करती है कि रेपो नंगे है। 2.) सामान्य रूप से संग्रहित फ़ाइलें .gitरूट पर संग्रहीत की जाती हैं (जिसे आप कहते हैं .git)
mozey

4
वे बिल्कुल वही परिवर्तन हैं जो करने के लिए क्लोनिंग .gitऔर सेटिंग core.bareका falseध्यान रखेंगे, इसलिए मैं अभी भी इस पद्धति के बारे में अच्छा महसूस करता हूं।
केन विलियम्स

10

यह मेरे लिए काम किया:

cd existing_folder
git init
git remote add origin path_to_your_repo.git
git add .
git commit
git push -u origin master

6

मुझे एक नई Apache वेब निर्देशिका (WHM के साथ बनाया गया खाता) के साथ ऐसी ही समस्या थी जिसे मैंने एक मंचन वेब सर्वर के रूप में उपयोग करने की योजना बनाई। मुझे शुरू में कोड बेस के साथ अपनी नई परियोजना को क्लोन करने की आवश्यकता थी और समय-समय पर भंडार से पुलिंग करके परिवर्तन को तैनात करना चाहिए।

समस्या यह थी कि खाते में पहले से ही वेब सर्वर फाइलें सम्‍मिलित थीं:

.bash_history
.bash_logout
.bash_profile
.bashrc
.contactemail
.cpanel/
...

... कि मैं अपनी रिपॉजिटरी को हटाना या कमिट करना नहीं चाहता था। मुझे उनकी जरूरत थी कि हम वहां सिर्फ अस्थिर और अनछुए रहें।

मैंने क्या किया:

मैं अपने वेब फ़ोल्डर (मौजूदा_ फ़ोल्डर) में गया:

cd /home/existing_folder

और फिर:

git init
git remote add origin PATH/TO/REPO
git pull origin master
git status

इसने (अपेक्षित के रूप में) कई नहीं मंचित फ़ाइलों की एक सूची प्रदर्शित की - जो पहले से ही मेरे cPanel वेब खाते से शुरू में मौजूद थीं।

फिर, इस लेख के लिए धन्यवाद , मैंने बस उन फ़ाइलों की सूची को इसमें जोड़ा:

**.git/info/exclude**

यह फ़ाइल, लगभग फ़ाइल की तरह .gitignore, आपको फ़ाइलों को मंचन से अनदेखा करने की अनुमति देती है। इसके बाद मेरे पास .git / निर्देशिका में कुछ भी करने के लिए नहीं था - यह एक व्यक्तिगत की तरह काम करता है.gitignore जिसे कोई और नहीं देख सकता है।

अब git statusरिटर्न की जाँच :

On branch master
nothing to commit, working tree clean

अब मैं अपने git रिपॉजिटरी से केवल खींचकर इस वेब सर्वर में बदलावों को तैनात कर सकता हूं। आशा है कि यह कुछ वेब डेवलपर्स को आसानी से एक मंचन सर्वर बनाने में मदद करता है।



4

हो सकता है कि मैं आपके प्रश्न को गलत समझ लूँ, लेकिन यह आसान नहीं होगा यदि आप फ़ाइलों को A से git repo B में कॉपी / स्थानांतरित करते हैं और आवश्यक लोगों को git add के साथ जोड़ते हैं ?

अद्यतन: git डॉक्टर से:

मौजूदा निर्देशिका में क्लोनिंग की अनुमति केवल तभी दी जाती है जब निर्देशिका खाली हो।

स्रोत: http://git-scm.com/docs/git-clone


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

ईमानदारी से, मुझे ऐसी हालत में विकसित होने की बात नहीं दिखती। क्या आप शाखाओं का उपयोग नहीं कर सकते और संचालन को मर्ज नहीं कर सकते हैं? या बाहरी निर्भरता वाले उप-रिपॉजिटरी हैं? आप एकल "गिट चेकआउट" पर भरोसा क्यों करना चाहेंगे?
रॉबर्टो एलोई

5
एक "सिंगल गिट चेकआउट" पूरे अध्यादेश की बात नहीं है। यह सिर्फ इतना है कि यह ऐसा ही है और हमें आगे बढ़ने के लिए एक रास्ता चाहिए। मैंने मूल प्रश्न को एक समाधान के साथ अद्यतन किया जो काम करता प्रतीत होता है। मैं प्रतिक्रिया की सराहना करता हूं, हालांकि।
डेल फॉरेस्टर

3
इसके लिए बहुत सारे वैध मामले हैं - मेरे पास एक जटिल फ़ोल्डर ट्री है जिसे सेटअप किया जाना है क्योंकि मेरी परियोजना का स्रोत सेटअप किया जा सकता है, और उस फ़ोल्डर ट्री में लाइसेंसीकृत कार्य शामिल हैं जिन्हें उदाहरण के लिए GitHub पर संग्रहीत नहीं किया जा सकता है।
BrainSlugs83

3

मैं कुछ इसी तरह की तलाश में था, और यहाँ मैं क्या लेकर आया हूँ:

मेरी स्थिति वह है जहां मेरे पास एक सक्रिय वेब ट्री है और मैं वर्तमान वेब ट्री में किसी भी फाइल को स्थानांतरित किए बिना इसके लिए एक रिमोट रिपॉजिटरी बनाने की कोशिश कर रहा था। यहाँ मैंने क्या किया है:

  1. वेब ट्री पर जाएं और रन करें git init
  2. रिपॉजिटरी के इच्छित स्थान पर जाएं और चलाएं: git clone --bare /path/to/web/repo
  3. मेरे दूरस्थ रेपो में कॉन्फ़िगर फ़ाइल को संपादित करें और [remote "origin"]अनुभाग निकालें ।
  4. [remote "origin"]नए दूरस्थ रेपो की ओर इशारा करते हुए वेब ट्री में .it / config को एक अनुभाग जोड़ें ।

मुझे यह रेसिपी बहुत पसंद है।
18

git clone --bareयहाँ ज़रूरत से ज़्यादा और घुमावदार है। सिर्फ git remote add origin <URL>पहली जगह में ही क्यों ?
आराक्सिया

3

यह मेरे लिए , काम है, लेकिन आपको दूरस्थ रिपोजिटरी फ़ाइलों को स्थानीय फ़ाइलों में मर्ज करना चाहिए:

git init
git remote add origin url-to-git
git branch --set-upstream-to=origin/master master
git fetch
git status

1

मुझे डेल का जवाब पसंद आया , और मैंने भी जोड़ा

git clone --depth 2 --no-checkout repo-to-clone existing-dir/existing-dir.tmp
git branch dev_new214
git checkout dev_new214
git add .
git commit
git checkout dev
git merge dev_new214

उथले गहराई ने बहुत सारे अतिरिक्त शुरुआती देव आवागमन से बचा लिया। नई शाखा ने हमें एक अच्छा दृश्य इतिहास दिया कि इस सर्वर से कुछ नया कोड था जिसे अंदर रखा गया था। यह मेरी राय में सही उपयोग शाखाएं हैं। यहां पोस्ट करने वाले सभी लोगों की महान अंतर्दृष्टि के लिए मेरा धन्यवाद।


0

सी / कोड को क्लोन करने की कोशिश करते समय मुझे वही मुद्दे मिले

लेकिन इस फ़ोल्डर में परियोजनाओं का एक पूरा गुच्छा है।

मैंने c / code / newproject में एक नया फ़ोल्डर बनाया और इस फ़ोल्डर में अपना क्लोन मैप किया।

डेस्कटॉप के लिए git तो मेरे उपयोगकर्ता से पूछा और फिर ठीक क्लोन किया।

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