ดึงไฟล์เดียวจากที่เก็บ


221

กลไกที่มีประสิทธิภาพมากที่สุดคืออะไร (เกี่ยวกับการถ่ายโอนข้อมูลและพื้นที่ดิสก์ที่ใช้) เพื่อรับเนื้อหาของไฟล์เดียวจากที่เก็บรีโมต git?

จนถึงตอนนี้ฉันก็มาถึง:

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

ดูเหมือนว่าจะยังเกินความเป็นจริงอยู่

สิ่งที่เกี่ยวกับการรับหลายไฟล์จาก repo


3
AAW ฉันจะรักมันหากมีวิธีที่สร้างขึ้นเพื่อทำเทียบเท่า "cat-remote" และ "tag-remote"
conny

3
ฉันมีปัญหาเดียวกันนี้ฉันต้องการมีไฟล์ลิขสิทธิ์เดียวกันใน 2 repos; แก้ไขไฟล์ใน 1 repo จากนั้นให้อัปเดตสำเนาอัตโนมัติใน repo อื่น
GlassGhost

คำตอบ:


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/322818593748303873
Rob Howard

13
ดูเหมือนว่าจะไม่ให้ไฟล์ดิบ แต่เป็นไฟล์ tar ที่มีเพียงไฟล์เดียว
Frerich Raabe

20
@FercherRaabe เพียงเพิ่ม `| tar -x` ไปยังคำสั่ง git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -x cat README.md
renier

12
คุณสามารถใช้tar -xOเพื่อส่งออกไปยัง STDOUT สำหรับการวางท่อเช่นFILE=README.md && git archive --remote=ssh://host/pathto/repo.git HEAD "$FILE" | tar -xO "$FILE"
paulcm

2
คำตอบที่ฉันกำลังค้นหา แต่ฉันได้รับ "ร้ายแรง: การดำเนินการไม่ได้รับการสนับสนุนโดยโปรโตคอล" ในการตอบสนองจาก Git โอ๊ะ
mhvelplund

68

ต่อจากยาคุบบ 's คำตอบ git archiveสร้างไฟล์เก็บถาวร tar หรือ zip ดังนั้นคุณต้องไพพ์เอาต์พุตผ่าน tar เพื่อรับเนื้อหาไฟล์:

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 --remoteบนที่เก็บ Git ที่โฮสต์โดย git-daemon คุณต้องเปิดใช้งานตัวเลือกการกำหนดค่า daemon.uploadarch ดู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 -

หมายเหตุ: ตัวอย่างไม่ได้ทดสอบ!
Jakub Narębski

7
สำหรับที่เก็บข้อมูลของคุณคุณต้องเปิดใช้งานการอัปโหลดไฟล์เก็บถาวรโดยเฉพาะหากใช้ git-daemon (git: // style urls) ด้วยgit config daemon.uploadarch trueบนที่เก็บระยะไกล โดยค่าเริ่มต้น git daemon จะปิดใช้งานการเก็บถาวรระยะไกลด้วย "ข้อผิดพลาดร้ายแรง: ระยะไกล: การเข้าถึงถูกปฏิเสธหรือที่เก็บไม่ได้ส่งออก: ... "
Patthoyts

+1 git archiveวิธีนี้เป็นความพยายามครั้งแรกของฉัน - แต่จากนั้นฉันสังเกตเห็นว่าการใช้tarเครื่องลูกข่ายไม่สะดวกสำหรับผู้ใช้ Windows เราได้รับข้อมูลจากcgitเซิร์ฟเวอร์ในพื้นที่ของเรา มันใช้งานได้ แต่ก็ไม่เร็วเท่าที่ฉันต้องการ (และยังต้องการการทำงานunix2dosหรือคล้ายกับเครื่อง Windows เนื่องจากเราเก็บไฟล์ที่มีจุดสิ้นสุดบรรทัด Unix ในที่เก็บ Git)
Frerich Raabe

1
@FrerichRaabe ใช้ -o fetched.zip ดูเพิ่มเติม --format = <fmt> ตัวเลือก
akhan

5
สำหรับสิ่งที่คุ้มค่าดูไม่เหมือนงานนี้ในที่เก็บโฮสต์ GitHub ดูhelp.github.com/articles/can-i-archive-a-repositoryและgroups.google.com/forum/#!topic/github/z8vLHcX0HxY
vmrob

30

ไม่ใช่โดยทั่วไป แต่ถ้าคุณใช้ Github:

สำหรับฉัน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:

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


3
นี่เป็นวิธีแก้ปัญหาที่ง่ายที่สุดและใช้ได้กับ txt แบบดิบที่หาได้ curl https://example.com/raw.txt > savedFile.txt
JacobPariseau

ตัวอย่าง wget ใช้งานไม่ได้ตัวอย่างของตัวอย่างขด
Kyle Baker

ทำงานได้ดีสำหรับฉัน คุณใส่ url ของคุณในเครื่องหมายคำพูดบน commandline หรือไม่?
Ankur Agarwal

สิ่งนี้ไม่รักษาประวัติคอมไพล์
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หมายถึงการแก้ไขสี่ครั้งนับจากนี้และ~เป็นตัวหนอนตามที่ระบุไว้ในความคิดเห็น


ตรวจสอบให้แน่ใจว่าไม่ได้เป็น 'ลบเครื่องหมาย' '-' ระหว่าง 'HEAD' และ '4' แต่ 'tilde' '~' เห็นได้ชัดว่าผมยังไม่ได้อ่านเอกสารคอมไพล์ได้ดีพอหรือแว่นตาของฉันต้องปรับปรุง ;-)
เดนนิส

18
ดูเหมือนว่าจะไม่ได้รับไฟล์จากที่เก็บระยะไกล แต่อย่างที่ OP ต้องการ
Mike Weller

หรือ: git show HEAD:./my_other_file > local_fileถ้าไฟล์ไม่ได้อยู่ใน root dir ของคุณ :)
kenorb

1
ขอความกรุณาให้กับผู้ลงคะแนนทั้งหมด - โปรดอธิบายและชี้แจงสิ่งที่ไม่เป็นประโยชน์ - เราอยู่ที่นี่เพื่อเรียนรู้และแบ่งปัน :)
Mars Robertson

9
@MichalStefanow: Mike Weller มีแล้ว; โดยเฉพาะสิ่งนี้จะไม่ทำงานในที่เก็บระยะไกล คุณต้องมีการโคลนนิ่งท้องถิ่นอย่างน้อยที่สุดแม้ว่าคุณจะตั้งค่ารีโมตไว้ก็ตาม
Rob Howard

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'.
Kos

3
สิ่งนี้ใช้ได้กับที่เก็บสาธารณะเท่านั้น สำหรับที่เก็บส่วนตัวคุณต้องมีการรับรองความถูกต้อง
Ricardo Otero

5

ตัวแปรที่เหมาะสมยิ่งของคำตอบบางส่วนที่นี่ที่ตอบคำถามของ OP:

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
Philipp Flenker

2
เอ่อ .. git ใช้มากกว่า GitHub
Willem van Ketwich

1
คุณตั้งอย่างชัดเจน - ใช้ URL github ในคำตอบของคุณ ;-)
Philipp Flenker

1
ขอบคุณสำหรับความคิดเห็น. ได้แก้ไขคำตอบแล้ว
Willem van Ketwich

2

หากที่เก็บของคุณรองรับโทเค็น (เช่น GitLab) ให้สร้างโทเค็นสำหรับผู้ใช้ของคุณจากนั้นนำทางไปยังไฟล์ที่คุณจะดาวน์โหลดและคลิกที่เอาต์พุต RAW เพื่อรับ 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

หากคุณต้องการคุณสามารถแทนที่ "BranchName" สำหรับ "HEAD"


2

ดูเหมือนว่าฉันจะใช้วิธีที่ง่ายที่สุดต่อไปนี้:

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

1

คำตอบของ Yisrael Dovนั้นตรงไปตรงมา แต่ไม่อนุญาตให้มีการบีบอัด คุณสามารถใช้--format=zipแต่คุณไม่สามารถคลายซิปได้โดยตรงด้วยคำสั่งไพพ์เช่นเดียวกับ tar คุณจึงต้องบันทึกเป็นไฟล์ชั่วคราว นี่คือสคริปต์:

#!/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 ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นเบราว์เซอร์จะเปิดหน้าใหม่ด้วย url เริ่มต้นด้วยhttps://raw.githubusercontent.com/ ...

เพียงป้อนคำสั่งในเทอร์มินัล:

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

ในขณะที่ไฟล์จะใส่ในโฟลเดอร์ของคุณ


ใช่มันใช้งานได้ดีใน Python หรือภาษาการเขียนโปรแกรมอื่น ๆ ด้วย REST-funcionality ตัวอย่างเช่นสำหรับการดาวน์โหลดโมดูลจากแหล่งเก็บข้อมูลที่แตกต่างกัน ..
Lars GJ

1

หากพื้นที่เก็บข้อมูล Git ของคุณโฮสต์บน Azure-DevOps (VSTS) คุณสามารถดึงไฟล์เดียวกับส่วนที่เหลือของ API

รูปแบบของ 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

มันต้องมีโทเค็นของ API ใช่ไหม
Yuriy Pozniak

ขึ้นอยู่กับวิธีที่คุณเรียกใช้ API
Shayki Abramczyk

0

ฉันใช้ curl ใช้ได้กับ repos สาธารณะหรือที่ใช้การรับรองความถูกต้องพื้นฐาน https ผ่านทางเว็บอินเตอร์เฟส

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

ฉันได้ทดสอบกับ github และ bitbucket แล้วใช้ได้ทั้งสองอย่าง


0

หากคุณต้องการรับไฟล์จากแฮชที่เฉพาะเจาะจง + ที่เก็บระยะไกลฉันได้ลอง git-archive แล้วและมันไม่ทำงาน

คุณจะต้องใช้ git clone และเมื่อที่เก็บถูกโคลนคุณจะต้องใช้ git-archive เพื่อให้มันทำงาน

ฉันโพสต์คำถามเกี่ยวกับวิธีการทำได้ง่ายขึ้นในเก็บถาวร git จากแฮชเฉพาะจากระยะไกล


0

สำหรับ bitbucket โดยตรงจากเบราว์เซอร์ (ฉันใช้ safari ... ) คลิกขวาที่ 'View Raw "และเลือก" ดาวน์โหลดไฟล์ที่เชื่อมโยง ":

ป้อนคำอธิบายรูปภาพที่นี่


0

หากคุณไม่สนใจที่จะโคลนไดเรกทอรีทั้งหมดฟังก์ชั่น bash / zsh ขนาดเล็กนี้จะมีผลลัพธ์สุดท้ายของการโคลนไฟล์เดียวในไดเรกทอรีปัจจุบันของคุณ (โดยโคลน repo ลงในไดเรกทอรีชั่วคราว

Pro: คุณได้รับไฟล์ที่คุณต้องการเท่านั้น

คอนดิชั่น: คุณยังคงต้องรอให้ repo ทั้งหมดลอกแบบ

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
}

คำตอบนี้อาจช่วยทำให้โคลนกระจัดกระจายที่ไม่มีค่าใช้จ่าย
Yuriy Pozniak

0

โซลูชัน Github Enterprise

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ที่ไหน
ShadSterling

1
คุณสามารถสร้างโทเค็นการเข้าถึงส่วนบุคคลได้โดยไปที่ https: // <your-github-server> / settings / tokens และกดปุ่ม "สร้างโทเค็นใหม่"
Oliver Pearmain

อืมเรามีระบบอัตโนมัติที่ได้รับชื่อผู้ใช้และรหัสผ่านซึ่งใช้ในการรับรองความถูกต้องกับระบบหลายระบบที่ใช้ SSO เดียวกันดังนั้นฉันจึงหวังว่าจะมีวิธีสร้างโทเค็นโดยอัตโนมัติด้วยชื่อผู้ใช้และรหัสผ่าน
ShadSterling

0

ถ้าเป้าหมายของคุณเป็นเพียงการดาวน์โหลดไฟล์ที่มีการประยุกต์ใช้การทะเลาะฟรีที่เรียกว่าgget:

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

ตัวอย่างข้างต้นจะดาวน์โหลดไฟล์เดียวจากhugoพื้นที่เก็บข้อมูล

https://github.com/dpb587/gget


-1

เกี่ยวข้องกับคำตอบของ @Steven Penny ฉันยังใช้ wget ด้วย นอกจากนี้เพื่อตัดสินใจว่าไฟล์ใดที่จะส่งออกไปยังฉันใช้ -O

หากคุณใช้ gitlabs ความเป็นไปได้อีกอย่างสำหรับ url คือ:

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

หากคุณไม่มีใบรับรองหรือคุณเข้าถึงจากเซิร์ฟเวอร์ที่เชื่อถือได้สำหรับการติดตั้ง gitlabs คุณต้องมี - ไม่มีการตรวจสอบใบรับรองตามที่ @Kos กล่าว ฉันชอบที่มากกว่าการแก้ไข. wgetrc แต่ขึ้นอยู่กับความต้องการของคุณ

หากเป็นไฟล์ขนาดใหญ่คุณอาจพิจารณาใช้ตัวเลือก -c กับ wget เพื่อให้สามารถดาวน์โหลดไฟล์ต่อจากตำแหน่งที่คุณทิ้งไว้หากเจตนาก่อนหน้านี้ล้มเหลวในระหว่างกลาง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.