कैसे उथले क्लोन 1 गहराई के साथ एक विशिष्ट प्रतिबद्ध है?


83

क्या यह संभव है कि एक भंडार में एक विशिष्ट प्रतिबद्ध उथला हो, अर्थात गहराई 1 के साथ? कुछ इस तरह

git clone http://myrepo.git 728a4d --depth 1

के रूप में यह SHA के साथ प्रतिबद्ध है, रिपॉजिटरी राज्य पाने के लिए 728a4d...?

प्रेरणा पूरे भंडार को क्लोन करने से बचने के लिए है, फिर उस विशिष्ट प्रतिबद्ध की जांच करें, जब हम केवल उस विशिष्ट प्रतिबद्ध पर भंडार की स्थिति में रुचि रखते हैं।


जवाबों:


81

Git 2.5.0 (जो क्लाइंट और सर्वर दोनों तरफ उपलब्ध होने की आवश्यकता है) के साथ शुरू करके आप uploadpack.allowReachableSHA1InWant=trueविशिष्ट SHA1s लाने में सक्षम करने के लिए सर्वर साइड पर सेट कर सकते हैं :

git init
git remote add origin <url>
git fetch --depth 1 origin <sha1>
git checkout FETCH_HEAD

ध्यान दें कि मुझे git cloneसीधे ऐसा करने के लिए एक सिंटैक्स नहीं मिला ।


3
यह कम से कम github के साथ काम नहीं करता है। मैं github.com/Seldaek/monolog/commit/… के लिए लाने नहीं कर सका । git fetch --depth 1 origin d6be96bc...शोfatal: Couldn't find remote ref d6be96bc...
किर्बी

9
सही है, GitHub केवल सक्षम बना दिया है allowTipSHA1InWant, लेकिन न तो allowReachableSHA1InWantहै और न ही allowAnySHA1InWant
sschuberth

मुझे यह कहते हुए एक त्रुटि हुईerror: pathspec 'FETCH_HEAD' did not match any file(s) known to git
रॉकेट्सपेसर

2
इसके साथ खेलते हुए, मैंने पाया कि यह केवल git क्लाइंट के एक बहुत ही आधुनिक संस्करण पर काम करता है। यहां तक ​​कि git 2.17 ने मेरे लिए काम नहीं किया। मैंने २.२४ पर git का पुनर्निर्माण किया और यह काम किया।
ईयाल

1
मेरे लिए 2.27.0.windows.1 पर github.com/dotnet/aspnetcore @ 62c098bc170f50feca15916e81cb7f321ffc52ff
JJS

25

नोट: मेरा उदाहरण एक प्रतिबद्ध हैश द्वारा क्लोन करने में मदद नहीं करता है, लेकिन यह एक टैग क्लोन करने में मदद करेगा और एक हल्का भंडार होगा।

यदि आपको अपने "क्लोन" में केवल एक ही प्रतिबद्ध होना है और आप प्रतिबद्ध हैश का उपयोग करने जा रहे हैं, तो संक्षिप्त उत्तर नहीं है

मैं टैग्स के लिए इस कमांड कंस्ट्रक्शन ( v2.13.2.windows.1 पर परीक्षण ) का उपयोग करता हूं :

git clone --depth 1 git@github.com:VENDOR/REPO.git --branch 1.23.0 --single-branch

पूर्ण उदाहरण:

$ git clone --depth 1 git@github.com:Seldaek/monolog.git --branch 1.23.0 --single-branch
Cloning into 'monolog'...
remote: Counting objects: 201, done.
remote: Compressing objects: 100% (188/188), done.
remote: Total 201 (delta 42), reused 32 (delta 5), pack-reused 0
Receiving objects: 100% (201/201), 190.30 KiB | 0 bytes/s, done.
Resolving deltas: 100% (42/42), done.
Note: checking out 'fd8c787753b3a2ad11bc60c063cff1358a32a3b4'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

$ cd monolog

.gitdir का आकार ( 267K बनाम 2.6M पूर्ण का उपयोग करके clone):

$ du -h --max-depth=0 .git
267K    .git

मैं निरूपित करना चाहूंगा, --branchएक टैग / शाखा ले सकता हूं ।

https://git-scm.com/docs/git-clone#git-clone---branchltnamegt

--branch टैग भी ले सकता है और इसके परिणामस्वरूप भंडार में उस प्रतिबद्ध को कम कर सकता है।

युपीडी

संक्षेप में, यह "रेफ्स" ले सकता है। आप यहां और अधिक पढ़ सकते हैं: "त्रुटि सर्वर अनजान वस्तु के लिए अनुरोध की अनुमति नहीं देता है" का क्या मतलब है?

इसके अलावा, कोई चाल नहीं है:

git fetch --depth 1 origin <COMMIT_HASH>

मेरी गलती में मुझे इंगित करने के लिए @BenjiWiebe धन्यवाद।


2
इसके लिए एक मिलियन अपवोट। जिस तरह से कई लोगों का दावा है कि यह संभव नहीं है।
jooks

3
--branchकरता नहीं करता, केवल शाखा नामों का समर्थन ... इस सब पर समाधान नहीं करता है। जैसा कि यह सच नहीं है।
समाप्त

1
किर्बी मैं अब यह करने की कोशिश कर रहा हूं, और यह कॉमेट्स के लिए काम नहीं करता है , जैसा कि @abourget कहते हैं। शायद यह टैग और शाखाओं के लिए काम करता है, लेकिन मैं इसे प्रतिबद्ध हैश के साथ करने की कोशिश कर रहा हूं और यह काम नहीं करता है।
बेन्जीवेबे

@BenjiWiebe, मैं आपकी बात समझ गया। हाँ, ऐसा लगता है, GIT एक विशिष्ट प्रतिबद्धता निर्धारित नहीं कर सकता है। : - / मैं इसे और गहरा खोदूँगा।
किर्बी

@BenjiWiebe, इसलिए, दुर्भाग्य से प्रतिबद्ध हैश का उपयोग करने का कोई तरीका नहीं है। बस डबल चेक किया।
किर्बी

6

तत्काल उत्तर है: आप नहीं कर सकते।
क्यों? विस्तृत विवरण यहां पाया जा सकता है: एक Git क्लोन विशिष्ट प्रतिबद्ध विकल्प क्यों नहीं है?

आप और क्या कर सकते हैं?

एक विशिष्ट प्रतिबद्धता के लिए रिपॉजिटरी क्लोन कैसे करें? (पूर्ण क्लोन)

# Create empty repository to store your content
git clone <url>
git reset <sha-1> --hard

और जानकारी:

एकल शाखा क्लोन कैसे करें?

git clone <url> --branch <branch_name> --single-branch <folder_name>

किसी दिए गए शाखा से केवल नवीनतम प्रतिबद्ध क्लोन कैसे करें?

git clone <url> --depth=1 --branch <branch_name> --single-branch <folder_name>

कैसे उथले क्लोन 1 गहराई के साथ एक विशिष्ट प्रतिबद्ध है?

जैसा कि @sschuberth ने टिप्पणी की: --depthतात्पर्य--single-branch

क्लोन के बजाय लाने के आदेश का उपयोग करें:

# fetch a commit (or branch or tag) of interest
# In this case you will have the full history of this commit
git fetch origin <sha1>

5
इस सवाल का जवाब नहीं है। प्रश्नकर्ता जानना चाहता है कि किसी एकल प्रतिबद्ध को चेकआउट कैसे करना है, भले ही इसके लिए सीधे इंगित करने के लिए कोई रेफरी न हो।
जोसेफ के। स्ट्रॉस

क्षमा करें, इसे याद किया, किसी तरह मैं समझ गया कि उसे नवीनतम प्रतिबद्ध की आवश्यकता है। उत्तर को अद्यतन करना। धन्यवाद
कोडवर्ड छिपकली

--depthतात्पर्य --single-branch, तो आप इसे उस स्थिति में छोड़ सकते हैं।
sschuberth

git fetchवास्तव में एक SHA1 के लिए स्वीकार करता है refspec?
फिल फ्रॉस्ट

झपकी लेना। इसका बस "
डाउनलोडिंग

5

whileबैश में प्रयोग करके देखें :

git clone --depth=1 $url
i=1; while ! git show $sha1; do git fetch --depth=$((i+=1)); done

यह बहुत धीमा है क्योंकि यह प्रत्येक व्यक्ति को अलग-अलग करता है; आप वेतन वृद्धि (बैचों में कमियां लाने और एक नेटवर्क पर प्रदर्शन में सुधार करने के लिए) बढ़ा सकते हैं, लेकिन यह अभी भी एक क्रूर बल दृष्टिकोण है।


क्यों पड़े वोट? ... मुझे वास्तव में ऐसा करने की जरूरत थी और मेरा समाधान यह हो गया!
कोरिन

क्या होगा यदि आप वर्षों पहले किए गए एक कमिट चाहते हैं या जो अब मौजूद नहीं है?
दान बकर

@DaanBakker, यदि कमिट मौजूद नहीं है, तो यह निर्धारित करने का एकमात्र तरीका पूरे दूरस्थ रिपॉजिटरी को लाना है और यदि यह नहीं है और कोई अन्य क्लोन नहीं है, तो आप दुर्भाग्य से एक मृत अंत में हैं।
कोरिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.