एक रिपॉजिटरी से एक भी फाइल को पुनः प्राप्त करें


221

एक दूरस्थ गिट रिपॉजिटरी से एक फ़ाइल की सामग्री प्राप्त करने के लिए सबसे कुशल तंत्र (डेटा स्थानांतरित और डिस्क स्थान का उपयोग करने के संबंध में) क्या है?

अब तक मैं इसके साथ आने में कामयाब रहा:

git clone --no-checkout --depth 1 git@github.com:foo/bar.git && cd bar && git show HEAD:path/to/file.txt

यह अभी भी overkill लगता है।

रेपो से कई फाइलें प्राप्त करने के बारे में क्या?


3
Aaw। मुझे अच्छा लगेगा अगर "कैट-रिमोट" और "टैग-रिमोट" के बराबर करने के लिए एक तरह से बनाया गया था।
कंस जूल

3
मुझे वही समस्या है जो मैं एक ही लाइसेंस फ़ाइल को 2 रेपो में रखना चाहता हूं; फ़ाइल को 1 रेपो में संपादित करें और फिर उसे अन्य रेपो में कॉपी को अपडेट करें।
ग्लासगॉस्ट

जवाबों:


144

git संस्करण 1.7.9.5 में यह रिमोट से किसी एक फाइल को एक्सपोर्ट करने के लिए काम करता है

git archive --remote=ssh://host/pathto/repo.git HEAD README.md

यह फ़ाइल की सामग्री को पूरा करेगा README.md


27
... सिवाय इसके GitHub पर काम नहीं करता। डैंग। :( twitter.com/GitHubHelp/status/3228185937484887873
रोब हावर्ड

13
यह कच्ची फ़ाइल के बजाय केवल एक फ़ाइल के साथ एक टार फ़ाइल उपज नहीं लगती है।
फ्रेरिच राबे

20
@FrerichRaabe अभी जोड़ें `| tar -x` कमांड को। git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -x cat README.md
Renier

12
आप tar -xOपाइपिंग के लिए आउटपुट के लिए उपयोग कर सकते हैं , उदाहरण के लिएFILE=README.md && git archive --remote=ssh://host/pathto/repo.git HEAD "$FILE" | tar -xO "$FILE"
paulcm

2
बिल्कुल सही जवाब, जिसकी मुझे तलाश थी, लेकिन मुझे "घातक: ऑपरेशन प्रोटोकॉल द्वारा समर्थित नहीं है।" Git से प्रतिक्रिया में। अरे।
मवेलपंड

68

से इसे जारी रखते हुए जेकब के जवाबgit archiveएक टार या ज़िप संग्रह तैयार करता है, इसलिए आपको फ़ाइल सामग्री प्राप्त करने के लिए टार के माध्यम से आउटपुट को पाइप करना होगा:

git archive --remote=git://git.foo.com/project.git HEAD:path/to/directory filename | tar -x

वर्तमान निर्देशिका में दूरस्थ रिपॉजिटरी के HEAD से 'फ़ाइलनाम' की एक प्रति बचाएगा।

:path/to/directoryभाग वैकल्पिक है। यदि बाहर रखा गया है, तो फ़ाइल को सहेजा जाएगा<current working dir>/path/to/directory/filename

इसके अलावा, यदि आप git archive --remotegit-daemon द्वारा होस्ट किए गए Git रिपॉजिटरी पर उपयोग को सक्षम करना चाहते हैं, तो आपको daemon.uploadarch config विकल्प को सक्षम करने की आवश्यकता है। Https://kernel.org/pub/software/scm/git/docs/git-daemon.html देखें


2
यदि यह एक पाठ फ़ाइल है और हम इसे किसी अन्य भाग में सहेजना चाहते हैं तो इसका उपयोग करने के लिए तैयार है: | tar -xO> ~ / destfile.ext
yucer

44

अगर वहाँ वेब इंटरफ़ेस तैनात है (जैसे कि gitweb, cgit, Gitorious, ginatra), तो आप इसे सिंगल फाइल ('कच्चा' या 'प्लेन' दृश्य) डाउनलोड करने के लिए उपयोग कर सकते हैं।

यदि दूसरा पक्ष इसे सक्षम करता है , तो आप उदाहरण के लिए git संग्रह के --remote=<URL>विकल्प का उपयोग कर सकते हैं (और संभवतः इसे दी गई फ़ाइल में दी गई निर्देशिका में सीमित कर सकते हैं):

$ git archive --remote=git@github.com:foo/bar.git --prefix=path/to/ HEAD:path/to/ |  tar xvf -

नोट: उदाहरण का परीक्षण नहीं किया गया था!
जकुब नारबस्की

7
git config daemon.uploadarch trueदूरस्थ रिपॉजिटरी के साथ git-daemon (git: // style urls) का उपयोग करने पर आपको अपने स्वयं के भंडार के लिए विशेष रूप से अपलोड-संग्रह को सक्षम करने की आवश्यकता है। डिफ़ॉल्ट git डेमॉन द्वारा रिमोट आर्काइव को "घातक: रिमोट एरर: एक्सेस अस्वीकृत या रिपॉजिटरी एक्सपोर्ट नहीं:" के साथ निष्क्रिय कर देता है ...
patthoyts

+1 git archiveदृष्टिकोण मेरा पहला प्रयास था - लेकिन तब मैंने देखा कि tarक्लाइंट मशीन पर विंडोज उपयोगकर्ताओं के लिए बिल्कुल सुविधाजनक नहीं था। हमने अपने स्थानीय cgitसर्वर से प्राप्त करना समाप्त कर दिया । यह काम करता है, लेकिन यह उतना तेज़ नहीं है जितना मैं इसे होना चाहता हूं (और यह अभी भी unix2dosविंडोज मशीनों पर चलने या परिचित होने की आवश्यकता है क्योंकि हम गिट लाइन भंडार में यूनिक्स लाइन के साथ फाइल स्टोर करते हैं)।
Frerich Raabe

1
@FrerichRaabe उपयोग -o लाया। इसके अलावा देखें --फॉर्मेट = <fmt> विकल्प।
अखन

5
इसके लायक क्या है, यह GitHub होस्ट किए गए रिपॉजिटरी पर इस तरह का काम नहीं करता है। देखें help.github.com/articles/can-i-archive-a-repository और groups.google.com/forum/#!topic/github/z8vLHcX0HxY
vmrob

30

सामान्य रूप से नहीं लेकिन अगर आप गितुब का उपयोग कर रहे हैं:

मेरे wgetलिए कच्चे url एक विशेष फ़ाइल को डाउनलोड करने का सबसे अच्छा और आसान तरीका निकला।

ब्राउज़र में फ़ाइल खोलें और "रॉ" बटन पर क्लिक करें। अब अपने ब्राउज़र को रिफ्रेश करें, url को कॉपी करें और उस पर wgetया curlकरें।

wget उदाहरण:

wget 'https://github.abc.abc.com/raw/abc/folder1/master/folder2/myfile.py?token=DDDDnkl92Kw8829jhXXoxBaVJIYW-h7zks5Vy9I-wA%3D%3D' -O myfile.py

कर्ल उदाहरण:

curl 'https://example.com/raw.txt' > savedFile.txt


3
यह सबसे आसान उपाय है, और किसी भी कच्चे txt के लिए काम करता है एक मिल सकता है। curl https://example.com/raw.txt > savedFile.txt
जैकबपरिसो

wget उदाहरण काम नहीं करता, कर्ल उदाहरण हालांकि करता है।
काइल बेकर

मेरे लिए बस ठीक काम करता है। क्या आपने अपने url को कमांडलाइन पर उद्धरण में रखा था?
अंकुर अग्रवाल

यह git के इतिहास को संरक्षित नहीं करता है
crypdick

15

दूरस्थ से एकल फ़ाइल निर्यात करने के लिए:

git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -x

यह फ़ाइल README.mdको आपकी वर्तमान निर्देशिका में डाउनलोड करेगा ।

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

git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -xO

आप कमांड के अंत में कई पथ प्रदान कर सकते हैं।


9

यह मेरे लिए एक समाधान की तरह दिखता है: http://gitready.com/intermediate/2009/02/27/get-a-file-from-a-specific-revision.html

git show HEAD~4:index.html > local_file

जहां 4अब से चार संशोधन का मतलब है और ~टिप्पणी में उल्लिखित एक टिल्ड है।


यह सुनिश्चित करें कि यह 'हेड' और '4' के बीच 'माइनस साइन' नहीं है, लेकिन 'टिल्ड' '~' है। जाहिरा तौर पर मैंने गिट डॉक्स को अच्छी तरह से नहीं पढ़ा है, या मेरे चश्मे को अपडेट करने की आवश्यकता है;;
डेनिस

18
यह फ़ाइल को दूरस्थ रिपॉजिटरी से प्राप्त करने के लिए प्रतीत नहीं होता है, हालांकि, ओपी की जरूरत है।
माइक वेलर

या: git show HEAD:./my_other_file > local_fileयदि फ़ाइल आपकी रूट dir में नहीं है :)
kenorb

1
सभी डाउनवोटर्स के लिए दयालु अनुरोध - कृपया स्पष्ट करें और स्पष्ट करें कि क्या ठीक नहीं है - हम यहां जानने और साझा करने के लिए हैं :)
मंगल राबर्टसन

9
@ मिचलसफांनो: माइक वेलर के पास है; विशेष रूप से, यह दूरस्थ रिपॉजिटरी पर काम नहीं करता है। आपको बहुत कम से कम एक स्थानीय क्लोन की आवश्यकता है, भले ही आपके पास उस पर सेट किए गए रीमोट हों।
रोब हावर्ड

6

मैं इसका उपयोग करता हूं

$ cat ~/.wgetrc
check_certificate = off

$ wget https://raw.github.com/jquery/jquery/master/grunt.js
HTTP request sent, awaiting response... 200 OK
Length: 11339 (11K) [text/plain]
Saving to: `grunt.js'

Wgetrc tweaks के बिना भी मेरे लिए काम करता है:wget https://raw.github.com/bk322/bk_automates/master/bkubuntu/bkubuntu.bash
Adobe

1
मेरा संदेश अधिक उपयोगी है:ERROR: Certificate verification error for raw.github.com: unable to get local issuer certificate. To connect to raw.github.com insecurely, use '--no-check-certificate'.
कोस

3
यह केवल सार्वजनिक रिपोजिटरी के लिए काम करता है। निजी रिपॉजिटरी के लिए आपको प्रमाणीकरण की आवश्यकता होती है।
रिकार्डो ओटेरो

5

ओपी के सवाल का जवाब देने वाले कुछ उत्तरों का एक बारीक संस्करण:

git archive --remote=git@archive-accepting-git-server.com:foo/bar.git \
  HEAD path/to/file.txt | tar -xO path/to/file.txt > file.txt

यह काम नहीं करता है, github git संग्रह का समर्थन नहीं करता है।
फिलिप फ्लेंकर

2
Err .. git का उपयोग सिर्फ GitHub से अधिक के लिए किया जाता है
Willem van Ketwich

1
आपने स्पष्ट रूप से सेट किया है
फिलिप

1
प्रतिक्रिया के लिए धन्यवाद। तदनुसार जवाब में संशोधन किया है।
विलेम वैन केटविच

2

यदि आप रिपॉजिटरी टोकन का समर्थन करते हैं (उदाहरण के लिए GitLab) तो अपने उपयोगकर्ता के लिए एक टोकन बनाएं, फिर उस फ़ाइल पर नेविगेट करें जिसे आप डाउनलोड करेंगे और URL प्राप्त करने के लिए रॉ आउटपुट पर क्लिक करेंगे। फ़ाइल का उपयोग डाउनलोड करने के लिए:

curl --silent --request GET --header 'PRIVATE-TOKEN: replace_with_your_token' \
'http://git.example.com/foo/bar.sql' --output /tmp/bar.sql

2

मैंने इस तरह से हल किया:

git archive --remote=ssh://git@gitlab.com/user/mi-repo.git BranchName /path-to-file/file_name | tar -xO /path-to-file/file_name > /path-to-save-the-file/file_name

यदि आप चाहते हैं, तो आप "HEAD" के लिए "BranchName" को बदल सकते हैं


2

यह मुझे निम्नलिखित का उपयोग करने का सबसे आसान तरीका लगता है:

wget https://github.com/name/folder/file.zip?raw=true

1

Yisrael Dov का उत्तर सीधा है, लेकिन यह संपीड़न की अनुमति नहीं देता है। आप का उपयोग कर सकते हैं --format=zip, लेकिन आप सीधे नहीं खोल सकते हैं कि टार के साथ आप जैसे पाइप कमांड के साथ कर सकते हैं, इसलिए आपको इसे एक अस्थायी फ़ाइल के रूप में सहेजने की आवश्यकता है। यहाँ एक स्क्रिप्ट है:

#!/bin/bash

BASENAME=$0

function usage {
    echo "usage: $BASENAME <remote-repo> <file> ..."
    exit 1
}

[ 2 -gt "$#" ] && { usage; }

REPO=$1
shift
FILES=$@

TMPFILE=`mktemp`.zip
git archive -9 --remote=$REPO HEAD $FILES -o $TMPFILE
unzip $TMPFILE
rm $TMPFILE

यह निर्देशिका के साथ भी काम करता है।


1

सिंगल फाइल के लिए, wget कमांड का उपयोग करें।

सबसे पहले, url प्राप्त करने के लिए "कच्चे" पर क्लिक करने के लिए नीचे दिए गए चित्र का पालन करें, अन्यथा आप HTML में एम्बेडेड कोड डाउनलोड करेंगे। यहां छवि विवरण दर्ज करें

फिर, ब्राउज़र https://raw.githubusercontent.com/ के साथ url के साथ एक नया पेज खोलेगा ...

बस टर्मिनल में कमांड दर्ज करें:

#wget https://raw.githubusercontent.com/...

एक समय आपके फ़ोल्डर में फ़ाइल डाल दिया जाएगा।


हां, यह पायथन या अन्य प्रोग्रामिंग भाषाओं के भीतर भी अच्छा काम करता है, एक REST-funcionality के साथ। विभिन्न रिपॉजिटरी से मॉड्यूल डाउनलोड करने के लिए उदाहरण के लिए ..
लार्स जीजे

1

यदि आपकी Git रिपॉजिटरी Azure-DevOps (VSTS) पर होस्ट की गई है, तो आप रेस्ट एपीआई के साथ एक सिंगल फाइल प्राप्त कर सकते हैं ।

इस API का प्रारूप इस तरह दिखता है:

 https://dev.azure.com/{organization}/_apis/git/repositories/{repositoryId}/items?path={pathToFile}&api-version=4.1?download=true

उदाहरण के लिए:

 https://dev.azure.com/{organization}/_apis/git/repositories/278d5cd2-584d-4b63-824a-2ba458937249/items?scopePath=/MyWebSite/MyWebSite/Views/Home/_Home.cshtml&download=true&api-version=4.1

यह एपीआई टोकन की आवश्यकता है, है ना?
युरी पॉज़निएक

निर्भर करता है कि आप
आपी

0

मैं कर्ल का उपयोग करता हूं, यह सार्वजनिक रिपॉजिट के साथ काम करता है या वेब इंटरफेस के माध्यम से https मूल प्रमाणीकरण का उपयोग करता है।

curl -L --retry 20 --retry-delay 2 -O https://github.com/ACCOUNT/REPO/raw/master/PATH/TO/FILE/FILE.TXT -u USER:PASSWORD

मैंने इसे जीथब और बिटबकेट पर परीक्षण किया है, दोनों पर काम करता है।


0

यदि आप एक विशिष्ट हैश से एक फ़ाइल प्राप्त करना चाहते हैं + एक दूरस्थ रिपॉजिटरी जिसे मैंने गिट-आर्काइव की कोशिश की है और यह काम नहीं किया।

आपको git क्लोन का उपयोग करना होगा और एक बार जब रिपॉजिटरी को क्लोन किया जाता है तो आपके पास काम करने के लिए git-आर्काइव का उपयोग करना होगा।

मैं एक प्रश्न पोस्ट करता हूं कि रिमोट से एक विशिष्ट हैश से गिट संग्रह में इसे और अधिक सरल कैसे किया जाए


0

सीधे ब्राउज़र से बिटबकेट के लिए (मैंने सफारी का इस्तेमाल किया ...) 'व्यू रॉ' पर राइट-क्लिक करें और "डाउनलोड लिंक्ड फ़ाइल डाउनलोड करें" चुनें:

यहां छवि विवरण दर्ज करें


0

यदि आप पूरी निर्देशिका का क्लोनिंग करने से गुरेज नहीं करते हैं, तो इस छोटे bash / zsh फ़ंक्शन के पास आपकी वर्तमान निर्देशिका में एकल फ़ाइल को क्लोन करने के लिए (रेपो को एक अस्थायी निर्देशिका में क्लोन करके और बाद में हटाकर) परिणाम होगा।

प्रो: आपको केवल वह फ़ाइल चाहिए जो आप चाहते हैं

Con: आपको अभी भी क्लोन करने के लिए पूरे रेपो की प्रतीक्षा करनी है

git-single-file () {
        if [ $# -lt 2 ]
        then
                echo "Usage: $0 <repo url> <file path>"
                return
        fi
        TEMP_DIR=$(mktemp -d)
        git clone $1 $TEMP_DIR
        cp $TEMP_DIR/$2 .
        rm -rf $TEMP_DIR
}

यह उत्तर विरल क्लोन बनाने में मदद कर सकता है, जो कि बिना ओवरहेड है।
युरी पॉज़निएक

0

Github Enterprise Solution

HTTPS_DOMAIN=https://git.your-company.com
ORGANISATION=org
REPO_NAME=my-amazing-library
FILE_PATH=path/to/some/file
BRANCH=develop
GITHUB_PERSONAL_ACCESS_TOKEN=<your-access-token>

URL="${HTTPS_DOMAIN}/raw/${ORGANISATION}/${REPO_NAME}/${BRANCH}/${FILE_PATH}"

curl -H "Authorization: token ${GITHUB_PERSONAL_ACCESS_TOKEN}" ${URL} > "${FILE_PATH}"

हम कहां मिलेंगे GITHUB_PERSONAL_ACCESS_TOKEN?
शाद्टरलिंग

1
आप https: // <अपने github-server> / settings / tokens और "Generate new token" बटन को दबाकर व्यक्तिगत एक्सेस टोकन बना सकते हैं।
ओलिवर पियरमैन

हम्म, हमारे पास एक ऑटोमेशन है जो एक उपयोगकर्ता नाम और पासवर्ड दिया जाता है, जो कि एक ही SSO का उपयोग करने वाले कई सिस्टम को प्रमाणित करने के लिए उपयोग किया जाता है, इसलिए मैं एक उपयोगकर्ता नाम और पासवर्ड दिए गए टोकन को स्वचालित करने के तरीके की उम्मीद कर रहा था।
शाद्टरलिंग

0

यदि आपका लक्ष्य सिर्फ फ़ाइल डाउनलोड करने का है तो एक परेशानी मुक्त आवेदन कहा जाता है gget:

gget github.com/gohugoio/hugo 'hugo_extended_*_Linux-ARM.deb'

उपरोक्त उदाहरण hugoरिपॉजिटरी से सिंगल फाइल डाउनलोड करेगा ।

https://github.com/dpb587/gget


-1

@Steven पेनी के जवाब से संबंधित, मैं भी wget का उपयोग करता हूं। इसके अलावा, यह तय करने के लिए कि मैं किस फाइल को आउटपुट का उपयोग करता हूं -O।

यदि आप url के लिए एक और संभावना gitlabs का उपयोग कर रहे हैं:

wget "https://git.labs.your-server/your-repo/raw/master/<path-to-file>" -O <output-file>

जब तक आपके पास प्रमाणपत्र नहीं है या आप gitlabs की स्थापना के लिए एक विश्वसनीय सर्वर से एक्सेस करते हैं - आपको चेक-सर्टिफिकेट @KK ने नहीं कहा है। मैं .wgetrc को संशोधित करने के बजाय पसंद करता हूं लेकिन यह आपकी आवश्यकताओं पर निर्भर करता है।

यदि यह एक बड़ी फ़ाइल है, तो आप wget के साथ -c विकल्प का उपयोग करने पर विचार कर सकते हैं। यदि पिछले इरादे के बीच में विफल होने पर आपने फ़ाइल को डाउनलोड करना जारी रखने में सक्षम होने के लिए इसे छोड़ दिया है।

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