विशिष्ट संशोधन / बदलाव के साथ git रिपॉजिटरी कैसे क्लोन करें?


393

मैं विशिष्ट पुनरीक्षण के साथ जीआईटी रिपॉजिटरी को कैसे क्लोन कर सकता हूं, जैसा कि मैं आमतौर पर मर्क्यूरियल में करता हूं:

hg clone -r 3 /path/to/repository

3
परिवर्तन-सेट या संशोधन के लिए विशिष्ट नहीं है, लेकिन एक विशिष्ट शाखा में नवीनतम क्लोनिंग के रूप में प्रभावी हो सकता है git clone -b 10.1 https://github.com/MariaDB/server.git --depth=1 mariadb-server-src
MrMesees


क्या आप चाहते हैं कि इतिहास उथला हो, यानी आपके उदाहरण में केवल संशोधन 3 हो, या यह भी माता-पिता का हो?
sschuberth

यदि प्रश्न में रिपॉजिटरी को दूसरे रिपॉजिटरी के अंदर से क्लोन किया जा रहा है और आप उस आंतरिक रेपो को एक विशिष्ट छाया में क्लोन करना चाहते हैं, तो गिट सबमॉड्यूल्स ठीक वैसा ही करते हैं जैसे कि एक स्वचालित तरीके से।
J0hnG4lt 10

जवाबों:


202

UPDATE 2 चूंकि Git 2.5.0 नीचे वर्णित सुविधा को कॉन्फ़िगरेशन चर के साथ सर्वर साइड पर सक्षम किया जा सकता है uploadpack.allowReachableSHA1InWant, यहाँ GitHub सुविधा अनुरोध और GitHub इस सुविधा को सक्षम करने के लिए प्रतिबद्ध है । ध्यान दें कि कुछ Git सर्वर इस विकल्प को डिफ़ॉल्ट रूप से सक्रिय करते हैं, जैसे Bitbucket Server ने 5.5+ संस्करण के बाद से इसे सक्षम किया । कॉन्फ़िगरेशन विकल्प को सक्रिय करने के तरीके के बारे में जानने के लिए Stackexchange पर यह उत्तर देखें ।

अद्यतन 1 Git संस्करणों के 1.7 < v < 2.5लिए git क्लोन और git रीसेट का उपयोग करते हैं, जैसा कि वैभव बाजपेयी के उत्तर में वर्णित है

यदि आप पूर्ण रिपॉजिटरी नहीं लाना चाहते हैं, तो संभवतः आपको उपयोग नहीं करना चाहिए clone। आप हमेशा उस शाखा का चयन करने के लिए भ्रूण का उपयोग कर सकते हैं जिसे आप लाना चाहते हैं। मैं एक hg विशेषज्ञ नहीं हूँ, इसलिए मुझे इसका विवरण नहीं पता है -rलेकिन git में आप ऐसा कुछ कर सकते हैं।

# make a new blank repository in the current directory
git init

# add a remote
git remote add origin url://to/source/repository

# fetch a commit (or branch or tag) of interest
# Note: the full history up to this commit will be retrieved unless 
#       you limit it with '--depth=...' or '--shallow-since=...'
git fetch origin <sha1-of-commit-of-interest>

# reset this repository's master branch to the commit of interest
git reset --hard FETCH_HEAD

32
मुझे नहीं लगता कि git fetch origin <sha1>काम करता है; ऐसा लगता है जैसे आपको एक नाम या संदर्भ का नाम जैसे संदर्भ देने की आवश्यकता है। Kerneltrap.org/mailarchive/git/2009/1/13/4707444 पर
Artur

48
@artur: आपको नहीं लगता कि यह काम करता है, या आपने इसकी कोशिश की है और यह काम नहीं करता है?
सीबी बेली

37
जीआईटी 1.4 के साथ, मैंने पाया कि मैं git fetch origin <SHA1>किसी भी संशोधन पर स्विच करने के लिए उपयोग करने में सक्षम था जो मैं चाहता था कि मैं मास्टर को रिमोट से प्राप्त करूँ और reset --hardस्थानीय रूप से शाखा को वास्तविक रूप से इंस्टेंट करने के लिए किया । मैं व्यक्तिगत संशोधनों को सीधे लाने में सक्षम नहीं था। Git 1.7 के साथ, git fetch origin <SHA1>काम नहीं किया, जैसा कि @artur द्वारा रिपोर्ट किया गया है; आप git checkout <SHA1>एक के बाद का उपयोग करने की जरूरत है reset --hard
जो मैकमोहन

6
SHA-1 द्वारा प्राप्त करना केवल http और rsync प्रोटोकॉल के साथ काम करेगा। Kerneltrap.org/mailarchive/git/2009/1/14/4716044/… पर
CharlesB

23
यह उत्तर पुराना है। यह जीआईटी 1.7 और जीआईटी 1.8 के साथ काम नहीं करता है, न ही https: // और न ही ssh प्रोटोकॉल के साथ। ("दूरस्थ रेफरी नहीं मिल सका df44398762393c67af487edeb0831ad9579df4aa" - यह रेफरी नहीं है, यह एक कमिट है।)
पाओलो एबरमन

838
$ git clone $URL
$ cd $PROJECT_NAME
$ git reset --hard $SHA1

फिर से सबसे हालिया प्रतिबद्ध पर वापस जाने के लिए

$ git pull

13
यह केवल तभी काम करता है यदि प्रतिबद्ध मास्टर शाखा में है, यदि नहीं तो यह स्थानीय संदर्भ को गड़बड़ाने वाला है। Git रीसेट और पहली बार में git चेकआउट क्यों नहीं?
जोकी

72
बड़े रेपो के लिए यह एक अच्छा विकल्प नहीं है, क्योंकि यह सब कुछ खींचता है।
गुप्त

1
यह समाधान शीर्ष पर होना चाहिए। किसी को परवाह नहीं है कि यह "इष्टतम नहीं है", यह वही है जो ओपी ने पूछा था। विशेष रूप से: "मैं विशिष्ट संशोधन के साथ गिट रिपॉजिटरी को कैसे क्लोन करूं"?
फ्लोरियन सेगिंगर

20
@FlorianSegginger यदि मैं एक विशिष्ट संशोधन को क्लोन करना चाह रहा हूँ तो संभवतः यह है कि मैं सब कुछ क्लोन नहीं करना चाहता, लेकिन केवल संशोधन करना चाहता हूँ। मेरे लिए यह सवाल पूछा गया था। यह समाधान एक अलग प्रश्न का उत्तर देता है: "मैं अपने रेपो में एक विशिष्ट संशोधन कैसे देख सकता हूं?"। पूरे रेपो को प्राप्त करना ठीक वैसा ही है जैसा यहां के बहुत से लोग बचना चाहते हैं।
रेनाटो

1
वास्तविक प्रश्न IMHO को संबोधित नहीं करता है, क्योंकि क्लोन के दौरान एक संशोधन निर्दिष्ट करने में सक्षम होने के कारण मुझे भी उपयोग करने की अनुमति मिलती है --depthजो कि अन्य रेपो के लिए बहुत महत्वपूर्ण है। इस समाधान के लिए सभी वस्तुओं को खींचने की आवश्यकता होती है, और फिर पहले के संशोधन पर रीसेट करना होता है। यह नेटवर्क बैंडविड्थ के लिए बहुत समय लेने वाला और बेकार है।
void.pointer

54

गिट रिपॉजिटरी को क्लोन करना, उपयुक्त रूप से, पूरे रिपॉजिटरी को क्लोन करता है: क्लोन करने के लिए केवल एक संशोधन का चयन करने का कोई तरीका नहीं है। हालांकि, एक बार जब आप प्रदर्शन करते हैं git clone, तो आप एक विशिष्ट संशोधन कर सकते हैं checkout <rev>


4
मैं केवल एक संशोधन क्लोन नहीं करना चाहता। मैं सिर्फ क्लोनिंग की सीमा निर्दिष्ट करना चाहता हूं। दूसरे शब्दों में, मैं सब कुछ निर्दिष्ट संशोधन के लिए क्लोन करना चाहता हूं।
जॉन

6
आप ऐसा नहीं कर सकते। git cloneपूरे भंडार को पकड़ लेता है। एक बार आपके पास होने के बाद, आप एक विशिष्ट संशोधन की जांच कर सकते हैं।

4
एक बात ध्यान दें; Git आम तौर पर इतिहास के भंडारण के बारे में बहुत कुशल है, इसलिए ऐसा नहीं है कि आप केवल आधे संशोधनों को क्लोन करके भारी मात्रा में स्थान बचा लेंगे।
एम्बर

यह "अंतरिक्ष को बचाने" के बारे में नहीं है - यह केवल एक विशिष्ट संशोधन तक पहुंचने के बारे में है - जैसे कि यदि किसी नए बदलाव ने बग को पेश किया है, और इसलिए मैं उस नए बदलाव को नहीं चाहता हूं - आप कह रहे हैं कि Git नहीं कर सकता। इस? यह सही नहीं हो सकता है - अगर आपके पास पुराने संस्करण में वापस नहीं आ सकते हैं तो स्रोत नियंत्रण क्यों है?
BrainSlugs83

1
"क्लोन करने के लिए केवल एक संशोधन का चयन करने का कोई तरीका नहीं है" - हाँ, वहाँ है:git clone --single-branch ...
morxa

33

किसी विशेष शाखा या टैग के उपयोग पर केवल एक ही विशिष्ट प्रतिबद्धता का क्लोन बनाने के लिए:

git clone --depth=1 --branch NAME https://github.com/your/repo.git

दुर्भाग्य से, NAMEकेवल शाखा का नाम या टैग नाम हो सकता है (SHA नहीं)।

--depthपूरे इतिहास को डाउनलोड करने के लिए ध्वज को छोड़ें और फिर उस शाखा या टैग को चेकआउट करें:

git clone --branch NAME https://github.com/your/repo.git

यह गिट के हालिया संस्करण के साथ काम करता है (मैंने इसे संस्करण के साथ किया था 2.18.0)।


लेकिन पुराने संस्करण
2.17.1

4
इसके लिए अधिक उर्जा की जरूरत है। यह अन्य पुराने उत्तरों की तुलना में बहुत बेहतर है।
.tienne

32

अगर आपका मतलब है कि आप शुरू से ही एक विशेष बिंदु तक सब कुछ प्राप्त करना चाहते हैं, तो चार्ल्स बैली का जवाब एकदम सही है। यदि आप वर्तमान दिनांक से वापस जाने वाले इतिहास के एक सबसेट को उल्टा करना चाहते हैं और प्राप्त कर सकते हैं, तो आप उस जगह का उपयोग कर सकते हैं git clone --depth [N] जहाँ N आपके इच्छित इतिहास के क्रमांक की संख्या है। तथापि:

--depth

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


4
गिट के नए संस्करण ने उथले क्लोनों में सुधार किया है, और आप इसे से खींच सकते हैं और धक्का दे सकते हैं।
ओरियन78फ्रंट

26

बस चीजों को योग करने के लिए (git v। 1.7.2.1):

  1. एक नियमित रूप से करें, git cloneजहां आप रेपो चाहते हैं (आज तक सब कुछ मिलता है - मुझे पता है, जो नहीं चाहता है, हम वहां पहुंच रहे हैं)
  2. git checkout <sha1 rev> आप चाहते हैं की संशोधित
  3. git reset --hard
  4. git checkout -b master

6
चरण 3 और 4 क्या करते हैं?
BrainSlugs83

चरण 4 ने मेरे लिए काम नहीं किया, लेकिन चरण 3 तक ने चाल चली - धन्यवाद
जीन बो

@ BrainSlugs83: चरण 4 नामक एक स्थानीय शाखा बनाता है masterऔर इसे स्विच करता है।
लार्स

3
@ एफिल: क्यों git reset --hard? डॉक्स का कहना है कि "इंडेक्स और वर्किंग ट्री को रीसेट करता है। वर्किंग ट्री में ट्रैक की गई फाइलों में कोई बदलाव <प्रतिबद्ध> [जो कि HEAD को डिफॉल्ट करता है, जो अब <sha1 rev>खत्म हो गया है]।" लेकिन इस बिंदु पर हमने क्लोनिंग के बाद से कोई बदलाव नहीं किया है, तो इसका क्या उद्देश्य है? क्या यह वर्तमान शाखा को काटता है <sha1 rev>?
लार्स

19

टीएल; डीआर - बस उस भ्रूण के कमांड में टैग का उपयोग करने के लिए प्रतिबद्ध करने के लिए स्रोत रिपॉजिटरी में एक टैग बनाएं। आप बाद में सफाई करने के लिए मूल रेपो से टैग हटा सकते हैं।

खैर, इसका 2014 और ऐसा लग रहा है कि 2010 से चार्ल्स बेली का स्वीकृत उत्तर अच्छी तरह से और अब तक पुराना है और अन्य उत्तरों में से अधिकांश (सभी?) में क्लोनिंग शामिल है, जिससे कई लोग बचने की उम्मीद कर रहे हैं।

निम्नलिखित समाधान प्राप्त करता है कि ओपी और कई अन्य क्या ढूंढ रहे हैं, जो इतिहास सहित एक भंडार की एक प्रति बनाने का एक तरीका है, लेकिन केवल एक निश्चित प्रतिबद्ध तक।

यहाँ कुछ कमांड्स हैं जिनका उपयोग मैंने git संस्करण 2.1.2 के साथ किया है ताकि एक स्थानीय रेपो (किसी अन्य निर्देशिका में एक रिपॉजिटरी) को एक निश्चित बिंदु तक क्लोन किया जा सके:

# in the source repository, create a tag against the commit you want to check out
git tag -m "Temporary tag" tmptag <sha1>

# create a new directory and change into that directory
cd somewhere_else;mkdir newdir;cd newdir

# ...and create a new repository
git init

# add the source repository as a remote (this can be a URL or a directory)
git remote add origin /path/to/original/repo

# fetch the tag, which will include the entire repo and history up to that point
git fetch origin refs/tags/tmptag

# reset the head of the repository
git reset --hard FETCH_HEAD

# you can now change back to the original repository and remove the temporary tag
cd original_repo
git tag -d tmptag

उम्मीद है कि यह समाधान कुछ और वर्षों तक काम करता रहेगा! :-)


2
यह एक अच्छा विचार है कि आप रेपो के मालिक हैं, यह सुनिश्चित नहीं है कि यह सार्वजनिक रिपोज के साथ काम करता है जिसे आप बनाए नहीं रखते हैं
सुहैब

18

आप बस का उपयोग कर सकते हैं git checkout <commit hash>

इस क्रम में

bash git clone [URLTORepository] git checkout [commithash]

प्रतिबद्ध हैश इस तरह दिखता है "45ef55ac20ce2389c9180658fdba35f4a66d204/


पिछले एक की तरह - आप क्लोन करने के बाद चेकआउट क्यों करते हैं। एक बार जब आप क्लोन करते हैं, तो आपके पास स्थानीय रेपो में पूरा इतिहास होता है। इस उत्तर के पास बहुत अधिक अपवाह क्यों हैं?
दिमित्री पर्फिलिएव

2

उपरोक्त उत्तरों में से 2 का उपयोग करना ( विशिष्ट संशोधन / परिवर्तन के साथ git रिपॉजिटरी को कैसे क्लोन करना है ? और विशिष्ट रीविजन / बदलाव के साथ git रिपॉजिटरी को कैसे क्लोन करना है? ) ने मुझे एक निश्चित के साथ आने में मदद की। यदि आप किसी बिंदु पर क्लोन बनाना चाहते हैं, तो उस बिंदु को एक टैग / शाखा होना चाहिए न कि केवल एक SHA या FETCH_HEAD भ्रमित हो जाता है। अगर आप किसी शाखा या टैग नाम का उपयोग करते हैं, तो आपको एक प्रतिक्रिया मिलती है, यदि आप SHA-1 का उपयोग करते हैं, तो आपको प्रतिक्रिया नहीं मिलती है।
यहाँ मैंने क्या किया है: - वास्तविक रेपो से पूर्ण रेपो का पूर्ण कार्यशील क्लोन बनाएं

cd <path to create repo>
git clone git@<our gitlab server>:ui-developers/ui.git 

फिर एक स्थानीय शाखा बनाएं, उस बिंदु पर जो दिलचस्प है

git checkout 2050c8829c67f04b0db81e6247bb589c950afb14
git checkout -b origin_point

फिर अपने मूल के रूप में मेरी स्थानीय प्रति के साथ, मेरा नया रिक्त प्रतिनिधि बनाएं

cd <path to create repo>
mkdir reduced-repo
cd reduced-repo
git init
git remote add local_copy <path to create repo>/ui
git fetch local_copy origin_point

उस समय मुझे यह प्रतिक्रिया मिली। मैं इसे नोट करता हूं क्योंकि यदि आप ऊपर की शाखा के स्थान पर SHA-1 का उपयोग करते हैं, तो कुछ भी नहीं होता है, इसलिए प्रतिक्रिया, इसका मतलब है कि यह काम करता है

/ var / www / html / ui-hacking $ git लाने के लिए local_copy Origin_point
दूरस्थ: गिनती की वस्तुओं: 45493, किया।
दूरस्थ: संपीड़ित वस्तुएं: 100% (15928/15928), किया।
दूरस्थ: कुल ४५४ ९ ३ (डेल्टा २8५० Total), पुन: ४५३ del (डेल्टा २3४६३)
प्राप्त वस्तुएं: 100% (45493/45493), 53.64 MiB | 50.59 MiB / s, किया गया।
समाधान डेल्टा: 100% (27508/27508), किया।
से / var / www / html / ui
 * शाखा का मूल_ बिंदु -> FETCH_HEAD
 * [एक नई शाखा] Origin_point -> मूल / Origin_point

अब मेरे मामले में, मुझे फिर से एक नए रेपो के रूप में गीतालाब को वापस लाने की आवश्यकता थी, इसलिए मैंने किया

git remote add origin git@<our gitlab server>:ui-developers/new-ui.git

जिसका मतलब था कि मैं अपने रेपो को क्रिएट_पाइंट से फिर से चुनकर git --git-dir=../ui/.git format-patch -k -1 --stdout <sha1> | git am -3 -kचेरी पिक रिमूव कर सकता हूं, फिर git push originपूरे लॉट को अपने नए घर में अपलोड करने के लिए उपयोग कर सकता हूं ।

आशा है कि किसी की मदद करता है


क्या आप समझा सकते हैं कि "FETCH_HEAD के साथ भ्रमित होने का क्या मतलब है"? और आपका git fetch local_copy origin_pointजेम्सगैस से अलग कैसे है git fetch origin refs/tags/tmptag?
not2qubit

git fetch local_copy origin_pointएक खाली साथ एक राज्य में तुम्हें छोड़ reduced-repoनिर्देशिका, केवल एक युक्त .git। इन निर्देशों को कुछ और याद आ रहा है ...
not2qubit

2

मेरा संस्करण स्वीकृत और सबसे उत्कीर्ण उत्तरों का संयोजन था। लेकिन यह थोड़ा अलग है, क्योंकि हर कोई SHA1 का उपयोग करता है, लेकिन कोई भी आपको यह नहीं बताता है कि इसे कैसे प्राप्त किया जाए

$ git init
$ git remote add <remote_url>
$ git fetch --all

अब आप सभी शाखाएँ और कमिट देख सकते हैं

$ git branch -a
$ git log remotes/origin/master <-- or any other branch

अंत में आप वांछित प्रतिबद्ध SHA1 को जानते हैं

git reset --hard <sha1>

1

मैं किसी भी संशोधन टैग, शाखा या हैश को बंद करने के लिए GNU मेक के साथ इस स्निपेट का उपयोग करता हूं

यह git संस्करण 2.17.1 पर परीक्षण किया गया था

${dir}:
    mkdir -p ${@D}
    git clone --recursive --depth 1 --branch ${revison} ${url} ${@} \
 || git clone --recursive --branch ${revison} ${url} ${@} \
 || git clone ${url} ${@}
    cd ${@} && git reset --hard ${revison}
    ls $@





0

git clone https://github.com/ORGANIZATION/repository.git (क्लोन भंडार)

cd repository (navigate to the repository)

git fetch origin 2600f4f928773d79164964137d514b85400b09b2

git checkout FETCH_HEAD


2
क्यों आप क्लोन के बाद लाने के लिए। एक बार जब आप क्लोन करते हैं, तो आपके पास स्थानीय रेपो में पूरा इतिहास होता है। इस उत्तर के दो उत्थान क्यों होते हैं?
मधेशिरेंस

0
# clone special tag/branch without history
git clone  --branch=<tag/branch> --depth=1 <repository>


# clone special revision with minimal histories
git clone --branch <branch> <repository> --shallow-since=yyyy-MM-ddTHH:mm:ss  # get the commit time
cd <dir>
git reset --hard <revision> 

यदि uploadpack.allowReachableSHA1InWant=trueसर्वर पर सेट नहीं किया गया है, तो आपको इतिहास के बिना कोई संशोधन नहीं मिल सकता है , जबकि आप इसके लिए एक टैग बना सकते हैं और इसके बजाय विशेष टैग को क्लोन कर सकते हैं।


-3

यह आसान है। आपको बस वर्तमान शाखा के लिए अपस्ट्रीम सेट करना होगा

$ git clone repo
$ git checkout -b newbranch
$ git branch --set-upstream-to=origin/branch newbranch
$ git pull

बस इतना ही


-4
git clone -o <sha1-of-the-commit> <repository-url> <local-dir-name>

gitशब्द का उपयोग originलोकप्रिय रूप से ज्ञात के अनुसार होता हैrevision

निम्नलिखित मैनुअल से एक स्निपेट है $ git help clone

--origin <name>, -o <name>
    Instead of using the remote name origin to keep track of the upstream repository, use <name>.

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

1
--depth=1जवाब में उल्लेख नहीं किया गया है, तो आप इस बात को क्यों कहेंगे कि यदि आपने और चीजों को जोड़ा है जो यहां उल्लेखित नहीं हैं? मुझे खुशी है कि यह आपके लिए काम कर रहा है, लेकिन यह उत्तर भ्रामक है और भाग में भी इस सवाल का जवाब नहीं देता है। इसलिए डाउनवोट्स।
एमिल स्टायरके

5
@ फ़ॉर्डी: नहीं। इस उत्तर का उपयोग करते हुए शब्दशः आपको वैसा ही पेड़ मिल जाता है जैसा कि आपको वेनिला से मिलेगा git clone <url> <local_dir_name>, बस इसे अपने लिए आज़माएँ। एकमात्र अंतर यह है कि रिमोट (उपयोग करके दिखाया गया git remote) को "मूल" नाम के बजाय कुछ क्रिप्टिक शा 1 अनुक्रम कहा जाएगा जो प्रथागत है। दूसरे शब्दों में, <sha1-of-the-commit>इस उत्तर में उल्लिखित कोई असर नहीं है, जिस पर सर्वर से संशोधन किए जाते हैं या किस शाखा की जाँच की जाएगी।
एमिल स्टायरके

6
@ फोर्डी: मैंने अभी-अभी किया git clone -o 896066ee1cf4d653057dac4e952f49c96ad16fa7 https://github.com/torvalds/linux.git linux --depth=1। यह मुझे संशोधन देता है 8a28d674और आपके जैसा नहीं है 896066ee और यह उत्तर दावा करता है।
एमिल स्टायरके

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