इतिहास के बिना एक git रेपो की प्रतिलिपि बनाएँ


200

वर्तमान में मेरे पास जीथब पर एक निजी भंडार है जिसे मैं सार्वजनिक करना चाहता हूं। हालाँकि कुछ शुरुआती कमिटमेंट में ऐसी जानकारी होती है जिसे मैं सार्वजनिक नहीं करना चाहता (हार्डकोड क्रिटिकल वगैरह)।

नवीनतम कमिट सार्वजनिक करने के लिए सबसे आसान मार्ग क्या है (मुझे सार्वजनिक भंडार में पिछले कमिट की आवश्यकता नहीं है या नहीं चाहिए) कुछ या सभी प्रतिबद्ध इतिहास को शामिल किए बिना?


आप सिर्फ एक नया भंडार क्यों नहीं बनाते हैं?
स्टेपहान

2
@ स्टेफ़न मैं एक नया रिपॉजिटरी बनाने के लिए ठीक हूं, लेकिन मैं पुरानी रिपॉजिटरी से नवीनतम स्थिति को कैसे छीन सकता हूं और इसे नए पर लाऊंगा?
राफ

19
आप केवल .it फ़ोल्डर को हटा सकते हैं और अपने स्रोतों के फ़ोल्डर पर फिर से एक init कर सकते हैं
Stephan

2
.गित फ़ोल्डर को हटाने से आपके दो रिपॉज़िटर्स असंगत हो जाएंगे, आप एक से दूसरे में विलय करने में सक्षम नहीं होंगे
अर्नोल्ड रो

क्या आप इसे वापस नहीं कर सकते? आप सचमुच सभी पुराने कमिट्स को स्क्वैश करते हैं और फिर (बल) पुश करते हैं।
xaxxon

जवाबों:


321

क्लोनिंग करते समय आप इतिहास की गहराई को सीमित कर सकते हैं :

--depth <depth>
Create a shallow clone with a history truncated to the specified 
number of revisions.

यदि आप सीमित इतिहास चाहते हैं, तो इसका उपयोग करें, लेकिन फिर भी कुछ।


40
इस आदमी को एक कुकी दें (इस उत्तर को सही चिह्नित करने के रूप में) :)
फेटनुलर

7
यह प्रश्न द्वारा निहित अभिप्रेत उपयोग को संबोधित नहीं करता है, जिसे दूरस्थ, सार्वजनिक रिपॉजिटरी में धकेलने में सक्षम होना है। एक उथले क्लोन को धकेलने की कोशिश में परिणाम होता है shallow update not allowed
ब्रैड नॉक्स

279

निम्न आदेश का उपयोग करें:

git clone --depth <depth> -b <branch> <repo_url>

कहाँ पे:

  • depthवह वह राशि है, जिसमें आप शामिल करना चाहते हैं। यानी यदि आप केवल नवीनतम प्रतिबद्ध उपयोग चाहते हैंgit clone --depth 1
  • branchउस दूरस्थ शाखा का नाम है जिसे आप क्लोन करना चाहते हैं। यदि आप चाहते हैं कि अंतिम 3 masterशाखा उपयोग से आएgit clone --depth 3 -b master
  • repo_url आपके भंडार का url है

7
यह वास्तव में गौटियर की तुलना में एक ही उत्तर है लेकिन अधिक पूर्ण और एक उदाहरण के साथ।
Aled

3
वास्तव में यह है। कभी-कभी उदाहरण की आवश्यकता होती है। मेरे लिए, यह लिखना इस मुद्दे को स्पष्ट करता है
अगम राफेलि

3
+1 मुख्य उत्तर के लिए, लेकिन यह भी कि आप किस शाखा में आवेदन करना चाहते हैं, यह चुनने के बारे में समझाने के लिए - मुझे पता है कि यह क्लोन कमांड का हिस्सा है - लेकिन यह मेरे साधारण दिमाग में सभी को एक साथ जोड़ता है ... और मुझे सरल पसंद है
:)

7
यह प्रश्न का उत्तर कैसे देता है? यह सब स्थानीय स्तर पर एक उथले क्लोन का निर्माण करता है, लेकिन फिर क्या? आप इस स्थानीय प्रतिलिपि को एक नए रेपो में सीमित इतिहास के साथ कैसे कॉपी कर सकते हैं?
ब्रेडडॉग

4
@BradDaBug एक मान्य बिंदु लाता है। मैंने गहराई को 1 तक सीमित करने के ऊपर दिए गए निर्देशों का पालन किया, फिर दूरस्थ मूल को बदल दिया और फिर अपने नए रेपो में धकेलने की कोशिश की। हालाँकि, मुझे एक त्रुटि बताते हुए मिला shallow update not allowed। मुझे यह स्टैक ओवरफ्लो उत्तर इस उदाहरण में उपयोगी पाया गया ।
क्रेग माइल

18

.gitफ़ोल्डर को हटाना शायद सबसे आसान रास्ता है क्योंकि आप इतिहास को नहीं चाहते / आवश्यकता नहीं है (जैसा कि स्टीफन ने कहा था)।

तो आप अपने नवीनतम प्रतिबद्ध से एक नया रेपो बना सकते हैं: ( बीज / किक-स्टार्ट प्रोजेक्ट को पूरे इतिहास के बिना कैसे क्लोन करें? )

git clone <git_url>

फिर हटाएं .git, और बाद में चलाएं

git init

या यदि आप अपने वर्तमान रेपो का पुन: उपयोग करना चाहते हैं : तो एक Git रिपॉजिटरी में केवल वर्तमान (प्रारंभिक) कमिट करें?

उपरोक्त चरणों का पालन करें:

git add .
git commit -m "Initial commit"

अपने रेपो को पुश करें।

git remote add origin <github-uri>
git push -u --force origin master

6
#!/bin/bash
set -e

# Settings
user=xxx
pass=xxx
dir=xxx
repo_src=xxx
repo_trg=xxx
src_branch=xxx

repo_base_url=https://$user:$pass@bitbucket.org/$user
repo_src_url=$repo_base_url/$repo_src.git
repo_trg_url=$repo_base_url/$repo_trg.git

echo "Clone Source..."
git clone --depth 1 -b $src_branch $repo_src_url $dir

echo "CD"
cd ./$dir

echo "Remove GIT"
rm -rf .git

echo "Init GIT"
git init
git add .
git commit -m "Initial Commit"
git remote add origin $repo_trg_url

echo "Push..."
git push -u origin master

2
--depth 1इस मामले में अनावश्यक है क्योंकि इतिहास भी साथ हटा दिया जाता हैrm -rf .git
rayphi

3
मुझे लगता है कि मैं इसे इस तरह से git clone --depth 1 -b $src_branch $repo_src_url $dir && cd ./$dir && git commit --amend --author "Some One <some@one.com>" -m "Initial Commit" && git remote set-url origin $repo_trg_url && git push -u origin master
करूँगा

11
@rayphi हाँ --depth 1अनावश्यक है, लेकिन यह हानिरहित भी है और यह एक छोटे नेटवर्क बैंडविड्थ को बचाता है (कोई भी इतिहास जो आपको किसी भी तरह से मिटाने के लिए नहीं है) को इंगित करता है
सिलास एस। ब्राउन

1
यदि आप अपनी रिपॉजिटरी को संगत रखना चाहते हैं तो मैं ऐसा करने की सलाह नहीं देता।
अर्नोल्ड रोआ

हटाना। .it सभी गिट हुक को भी हटाते हैं।
JudaPriest

0

क्या यह ठीक नहीं है जो एक रिबेस को तोड़ता है? अंतिम प्रतिबद्ध को छोड़कर सब कुछ स्क्वैश करें और फिर (बल) इसे धक्का दें।

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