git - एक "गिट निर्यात" करें(जैसे "svn export")?




git-archive svn-export (20)

आप ज़िप फ़ाइल के रूप में किसी भी प्रतिबद्धता पर रिमोट रेपो को संग्रहीत कर सकते हैं।

git archive --format=zip --output=archive.zip [email protected]:PROJECTNAME.git HASHOFGITCOMMIT

मैं सोच रहा हूं कि कोई अच्छा "गिट निर्यात" समाधान है जो .git रिपोजिटरी निर्देशिका के बिना पेड़ की एक प्रति बनाता है। कम से कम तीन विधियों के बारे में मुझे पता है:

  1. git clone बाद .git रिपोजिटरी निर्देशिका को हटाकर।
  2. git checkout-index इस कार्यक्षमता को दर्शाता है लेकिन "इंडेक्स में वांछित पेड़ को बस पढ़ें ..." से शुरू होता है, जिसे मैं पूरी तरह से सुनिश्चित नहीं करता कि कैसे करना है।
  3. git-export एक तीसरी पार्टी स्क्रिप्ट है जो अनिवार्य रूप से एक अस्थायी स्थान पर एक git clone करता है जिसके बाद अंतिम गंतव्य में rsync --exclude='.git' होता है।

इनमें से कोई भी समाधान वास्तव में मुझे संतोषजनक होने के रूप में नहीं रोकता है। svn export निकटतम विकल्प विकल्प 1 हो सकता है, क्योंकि उन दोनों को लक्ष्य निर्देशिका को खाली होने की आवश्यकता होती है। लेकिन विकल्प 2 भी बेहतर लगता है, मानते हुए कि मैं यह समझ सकता हूं कि इंडेक्स में पेड़ को पढ़ने का क्या अर्थ है।


ऐसा लगता है कि एसवीएन की तुलना में गिट के साथ यह एक मुद्दा है। गिट केवल एक .git फ़ोल्डर को भंडार रूट में रखता है, जबकि एसवीएन प्रत्येक उपनिर्देशिका में एक .svn फ़ोल्डर डालता है। तो "svn export" रिकर्सिव कमांड लाइन जादू से बचाता है, जबकि गिट रिकर्सन के साथ आवश्यक नहीं है।


क्लोन के रूप में सरल के रूप में .git फ़ोल्डर को हटा दें:

git clone url_of_your_repo path_to_export && rm -rf path_to_export/.git


गिट रिपोजिटरी को निर्यात करने के तरीके की तलाश करते समय मैंने इस पृष्ठ को बार-बार मारा है। इस प्रश्न का मेरा जवाब तीन गुणों पर विचार करता है जो एसवीएन निर्यात गिट की तुलना में डिजाइन द्वारा है, क्योंकि svn एक केंद्रीकृत भंडार दृष्टिकोण का पालन करता है:

  • यह सभी संशोधनों को निर्यात न करके रिमोट रिपोजिटरी स्थान पर यातायात को कम करता है
  • इसमें निर्यात निर्देशिका में मेटा जानकारी शामिल नहीं है
  • Svn का उपयोग करके एक निश्चित शाखा का निर्यात उपयुक्त पथ निर्दिष्ट करके पूरा किया जाता है

    git clone --depth 1 --branch master git://git.somewhere destination_path
    rm -rf destination_path/.git
    

एक निश्चित रिलीज का निर्माण करते समय एक स्थिर शाखा को क्लोन करना उपयोगी होता है उदाहरण के लिए --branch stable या --branch release/0.9


मुझे पता चला कि विकल्प 2 का क्या मतलब है। एक भंडार से, आप कर सकते हैं:

git checkout-index -a -f --prefix=/destination/path/

पथ के अंत में स्लैश महत्वपूर्ण है, अन्यथा परिणामस्वरूप 'पथ' के उपसर्ग के साथ फाइलें / गंतव्य में होंगी।

चूंकि एक सामान्य स्थिति में सूचकांक में भंडार की सामग्री होती है, इसलिए "सूचकांक में वांछित पेड़ को पढ़ने" के लिए कुछ भी विशेष नहीं है। यह पहले से ही है।

इंडेक्स में सभी फाइलों को देखने के लिए फ्लैग की आवश्यकता है (मुझे यकीन नहीं है कि इस स्थिति में इस ध्वज को छोड़ने का क्या अर्थ है, क्योंकि यह वही नहीं करता है जो मैं चाहता हूं)। -f फ्लैग बलों आउटपुट में किसी मौजूदा फाइल को ओवरराइट कर रहा है, जो यह आदेश सामान्य रूप से नहीं करता है।

ऐसा लगता है कि मैं "गिट निर्यात" की तरह दिख रहा था।


मेरी प्राथमिकता वास्तव में आपके मेकफ़ाइल (या अन्य निर्माण प्रणाली) में एक दूरस्थ लक्ष्य होना चाहिए जो आपके कोड (.tar.bz2, .zip, .jar, या जो कुछ भी उचित है) का एक वितरित संग्रह निर्यात करता है। यदि आप जीएनयू ऑटोोटूल या पर्ल की मेकमेकर सिस्टम का उपयोग करते हैं, तो मुझे लगता है कि यह आपके लिए स्वचालित रूप से मौजूद है। यदि नहीं, तो मैं इसे जोड़ने की अत्यधिक अनुशंसा करता हूं।

ईटीए (2012-09-06): वाह, कठोर downvotes। मुझे अभी भी विश्वास है कि आपके स्रोत कोड नियंत्रण उपकरण की बजाय अपने निर्माण टूल के साथ अपने वितरण का निर्माण करना बेहतर है। मैं निर्माण उपकरण के साथ कलाकृतियों के निर्माण में विश्वास करता हूं। मेरे वर्तमान काम में, हमारा मुख्य उत्पाद एक चींटी लक्ष्य के साथ बनाया गया है। हम स्रोत कोड नियंत्रण प्रणाली स्विच करने के बीच में हैं, और इस चींटी लक्ष्य की उपस्थिति का मतलब माइग्रेशन में एक कम परेशानी है।


मैं बस यह इंगित करना चाहता हूं कि आप जिस मामले में हैं

  1. भंडार के उप फ़ोल्डर को निर्यात करना (इस प्रकार मैं एसवीएन निर्यात सुविधा का उपयोग करता था)
  2. उस फ़ोल्डर से सब कुछ को तैनाती गंतव्य पर कॉपी करने के साथ ठीक है
  3. और चूंकि आपके पास पहले से ही संपूर्ण भंडार की एक प्रति है।

फिर आप उल्लिखित git-archive master foo | -x -C [destination] बजाय cp foo [destination] उपयोग कर सकते हैं git-archive master foo | -x -C [destination]


मैंने git-checkout-index चारों ओर एक साधारण रैपर लिखा है जिसे आप इस तरह उपयोग कर सकते हैं:

git export ~/the/destination/dir

यदि गंतव्य निर्देशिका पहले से मौजूद है, तो आपको -f या --force जोड़ने की आवश्यकता होगी।

स्थापना सरल है; बस अपने PATH में कहीं भी स्क्रिप्ट ड्रॉप करें, और सुनिश्चित करें कि यह निष्पादन योग्य है।

git-export लिए जिथब भंडार


यदि आप फ़ाइलों को शामिल नहीं कर रहे हैं .gitattributes export-ignore तो git checkout आज़माएं

mkdir /path/to/checkout/
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout -f -q

-f
इंडेक्स से पथों की जांच करते समय, अनमोल प्रविष्टियों पर असफल न हों; इसके बजाय, अनमोल प्रविष्टियों को नजरअंदाज कर दिया जाता है।

तथा

-q
Verbose से बचें

इसके अतिरिक्त आप किसी भी शाखा या टैग या एसवीएन में एक विशिष्ट कमेटी संशोधन से प्राप्त कर सकते हैं जैसे कि एसएचए 1 (गिट में SHA1 एसवीएन में संशोधन संख्या के बराबर है)

mkdir /path/to/checkout/
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout 2ef2e1f2de5f3d4f5e87df7d8 -f -q -- ./

/path/to/checkout/ खाली होना चाहिए, गिट किसी भी फाइल को नहीं हटाएगा, लेकिन बिना किसी चेतावनी के एक ही नाम वाली फाइलों को ओवरराइट करेगा

अद्यतन: सिर की समस्या से बचने के लिए या टैग, शाखाओं या SHA1 के साथ निर्यात के लिए चेकआउट का उपयोग करते समय कार्यरत भंडार को बरकरार रखने के लिए, आपको अंत में -- ./ जोड़ना होगा

डबल डैश -- गिट बताता है कि डैश के बाद सबकुछ पथ या फाइलें हैं, और इस मामले में भी git checkout को HEAD बदलने के लिए नहीं बताता है

उदाहरण:

यह आदेश केवल libs निर्देशिका और readme.txt फ़ाइल को ठीक से प्रतिबद्ध करेगा

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout fef2e1f2de5f3d4f5e87df7d8 -f -q -- ./libs ./docs/readme.txt

यह my_file_2_behind_HEAD.txt बना देगा (ओवरराइट) हेड HEAD^2 पीछे दो काम करता है

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout HEAD^2 -f -q -- ./my_file_2_behind_HEAD.txt

एक और शाखा के निर्यात प्राप्त करने के लिए

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout myotherbranch -f -q -- ./

ध्यान दें कि ./ रिपोजिटरी की जड़ से संबंधित है


यह फाइलों को एक टैर फ़ाइल में कई प्रकार की गतिविधियों (सी से जी) में कॉपी करेगा। नोट: यह केवल फाइलों को ही प्राप्त करेगा। पूरे भंडार नहीं। Here से थोड़ा संशोधित

उदाहरण कमिट इतिहास

ए -> बी -> सी -> डी -> ई -> एफ -> जी -> एच -> मैं

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT C~..G | xargs tar -rf myTarFile.tar

Here

-आर -> उप-पेड़ में भर्ती करें

--no-commit-id -> गिट diff-tree लागू होने पर प्रतिबद्ध आईडी के साथ एक पंक्ति आउटपुट करता है। इस ध्वज ने प्रतिबद्ध आईडी आउटपुट को दबा दिया।

- केवल-नाम -> बदली गई फ़ाइलों के केवल नाम दिखाएं।

--डिफ-फ़िल्टर = एसीएमआरटी -> केवल इन फ़ाइलों का चयन करें। फाइलों की पूरी सूची के लिए यहां देखें

सी .. जी -> इस श्रेणी में फ़ाइलें काम करता है

सी ~ -> कमिट सी से फाइलें शामिल करें कमेटी सी के बाद से सिर्फ फाइलें नहीं।

| xargs tar -rf myTarFile -> आउटपुट टैर


संभवतः इसे प्राप्त करने का सबसे आसान तरीका git archive साथ है। यदि आपको वास्तव में केवल विस्तारित पेड़ की आवश्यकता है तो आप ऐसा कुछ कर सकते हैं।

git archive master | tar -x -C /somewhere/else

अधिकांश समय मुझे गिट से कुछ 'निर्यात' करने की ज़रूरत है, मैं किसी भी मामले में संपीड़ित संग्रह चाहता हूं इसलिए मैं ऐसा कुछ करता हूं।

git archive master | bzip2 >source-tree.tar.bz2

ज़िप संग्रह:

git archive --format zip --output /full/path/to/zipfile.zip master 

अधिक जानकारी के लिए git help archive , यह काफी लचीला है।

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

नोट: यदि आप इंडेक्स को निर्यात करने में रुचि रखते हैं, तो आदेश है

git checkout-index -a -f --prefix=/destination/path/

(अधिक जानकारी के लिए ग्रेग का जवाब देखें)


हां, this संग्रह में किसी भी गिट समावेशन के बिना आपके कोड को संग्रहीत करने के लिए एक साफ और साफ आदेश है और किसी भी गिट प्रतिबद्ध इतिहास के बारे में चिंता किए बिना पास होने के लिए अच्छा है।

git archive --format zip --output /full/path/to/zipfile.zip master 

git archive --remote उपयोगकर्ताओं के लिए, git archive --remote विधि सीधे काम नहीं करेगा, क्योंकि docs । आपको यूआरएल के लिए गिटहब से पूछना चाहिए, फिर उस यूआरएल को डाउनलोड करें। curl इतना आसान बनाता है:

curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | tar xzf -

यह आपको स्थानीय निर्देशिका में निर्यात कोड देगा। उदाहरण:

$ curl -L https://api.github.com/repos/jpic/bashworks/tarball | tar xzf -
$ ls jpic-bashworks-34f4441/
break  conf  docs  hack  LICENSE  mlog  module  mpd  mtests  os  README.rst  remote  todo  vcs  vps  wepcrack

संपादित करें
यदि आप चाहते हैं कि कोड एक विशिष्ट, मौजूदा निर्देशिका (गिटूब से यादृच्छिक एक के बजाय) में डाला जाए:

curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | \
tar xzC /path/you/want --strip 1

git archive रिमोट रिपोजिटरी के साथ भी काम करता है।

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master | tar -xf -

रेपो के अंदर विशेष पथ को निर्यात करने के लिए जितना संभव हो उतना पथ जोड़ें जितना आप गिट के अंतिम तर्क के रूप में चाहते हैं, उदाहरण के लिए:

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master path1/ path2/ | tar -xv

मेरे पास मेरी .bashrc फ़ाइल में निम्न उपयोगिता फ़ंक्शन है: यह एक गिट भंडार में वर्तमान शाखा का संग्रह बनाता है।

function garchive()
{
  if [[ "x$1" == "x-h" || "x$1" == "x" ]]; then
    cat <<EOF
Usage: garchive <archive-name>
create zip archive of the current branch into <archive-name>
EOF
  else
    local oname=$1
    set -x
    local bname=$(git branch | grep -F "*" | sed -e 's#^*##')
    git archive --format zip --output ${oname} ${bname}
    set +x
  fi
}

एक विशेष मामला जवाब अगर गिटहब पर भंडार होस्ट किया गया है।

बस svn export उपयोग करें।

जहां तक ​​मुझे पता है कि archive --remote अनुमति नहीं देता है। यद्यपि गिटहब एसवीएन संगत है और उनके पास सभी गिट रिपोज़ svn सुलभ हैं, इसलिए आप केवल अपने गिटहब यूआरएल में कुछ समायोजन के साथ svn export उपयोग कर सकते हैं।

उदाहरण के लिए एक संपूर्ण भंडार निर्यात करने के लिए, ध्यान दें कि यूआरएल में trunk master को प्रतिस्थापित master (या जो भी परियोजना की हेड शाखा सेट है ):

svn export https://github.com/username/repo-name/trunk/

और आप एक फ़ाइल या यहां तक ​​कि एक निश्चित पथ या फ़ोल्डर निर्यात कर सकते हैं:

svn export https://github.com/username/repo-name/trunk/src/lib/folder

JQuery जावास्क्रिप्ट लाइब्रेरी के साथ उदाहरण

HEAD का उपयोग करके HEAD शाखा या मास्टर शाखा उपलब्ध होगी:

svn ls https://github.com/jquery/jquery/trunk

गैर- HEAD शाखाएं /branches/ अंतर्गत पहुंच योग्य होंगी:

svn ls https://github.com/jquery/jquery/branches/2.1-stable

एक ही फैशन में /tags/ तहत सभी टैग :

svn ls https://github.com/jquery/jquery/tags/2.1.3

इसे आसान तरीका करना, यह .bash_profile के लिए एक फ़ंक्शन है, यह सीधे वर्तमान स्थान पर संग्रह को अनजिप करता है, पहले अपना सामान्य [url: path] कॉन्फ़िगर करें। नोट: इस फ़ंक्शन के साथ आप क्लोन ऑपरेशन से बचते हैं, यह सीधे रिमोट रेपो से मिलता है।

gitss() {
    URL=[url:path]

    TMPFILE="`/bin/tempfile`"
    if [ "$1" = "" ]; then
        echo -e "Use: gitss repo [tree/commit]\n"
        return
    fi
    if [ "$2" = "" ]; then
        TREEISH="HEAD"
    else
        TREEISH="$2"
    fi
    echo "Getting $1/$TREEISH..."
    git archive --format=zip --remote=$URL/$1 $TREEISH > $TMPFILE && unzip $TMPFILE && echo -e "\nDone\n"
    rm $TMPFILE
}

.Gitconfig के लिए उपनाम, एक ही कॉन्फ़िगरेशन आवश्यक है (.git प्रोजेक्ट्स के अंदर कमांड को निष्पादित करने के लिए सावधानी बरतें, यह हमेशा यहां बताए गए आधार डीआईआर पर कूदता है , जब तक कि यह तय नहीं हो जाता है, मैं व्यक्तिगत रूप से फ़ंक्शन को प्राथमिकता देता हूं

ss = !env GIT_TMPFILE="`/bin/tempfile`" sh -c 'git archive --format=zip --remote=[url:path]/$1 $2 \ > $GIT_TMPFILE && unzip $GIT_TMPFILE && rm $GIT_TMPFILE' -

मुझे इसे एक तैनाती स्क्रिप्ट के लिए जरूरी था और मैं उपर्युक्त दृष्टिकोणों में से किसी का भी उपयोग नहीं कर सका। इसके बजाय मैंने एक अलग समाधान निकाला:

#!/bin/sh
[ $# -eq 2 ] || echo "USAGE $0 REPOSITORY DESTINATION" && exit 1
REPOSITORY=$1
DESTINATION=$2
TMPNAME="/tmp/$(basename $REPOSITORY).$$"
git clone $REPOSITORY $TMPNAME
rm -rf $TMPNAME/.git
mkdir -p $DESTINATION
cp -r $TMPNAME/* $DESTINATION
rm -rf $TMPNAME

मेरे पास एक और समाधान है जो ठीक काम करता है यदि आपके पास मशीन पर रिपोजिटरी की एक स्थानीय प्रति है जहां आप निर्यात बनाना चाहते हैं। इस मामले में इस भंडार निर्देशिका में जाएं, और इस आदेश को दर्ज करें:

GIT_WORK_TREE=outputdirectory git checkout -f

यह विशेष रूप से उपयोगी होता है यदि आप एक गिट रिपोजिटरी वाली वेबसाइट प्रबंधित करते हैं और इसमें एक क्लीन संस्करण चेकआउट करना चाहते हैं /var/www/। इस मामले में, इस कमांड को एक .git/hooks/post-receiveस्क्रिप्ट में जोड़ें ( hooks/post-receiveएक नंगे भंडार पर, जो इस स्थिति में अधिक उपयुक्त है)


मैंने इसे करने के लिए सबसे आसान तरीका देखा है (और विंडोज़ पर भी काम करता है) है git bundle:

git bundle create /some/bundle/path.bundle --all

अधिक जानकारी के लिए यह उत्तर देखें: मैं अपने विंडोज मशीन से यूएसबी ड्राइव के माध्यम से एक लिनक्स मशीन में अपनी गिट रिपॉजिटरी कैसे कॉपी कर सकता हूं?







svn-export