Lấy một tập tin duy nhất từ ​​một kho lưu trữ


220

Cơ chế hiệu quả nhất (liên quan đến dữ liệu được truyền và dung lượng đĩa được sử dụng) để lấy nội dung của một tệp từ kho lưu trữ git từ xa là gì?

Cho đến nay tôi đã xoay sở để đưa ra:

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

Điều này vẫn có vẻ quá mức cần thiết.

Điều gì về việc nhận được nhiều tập tin từ repo?


3
Aaw. Tôi sẽ thích nó nếu có một cách được xây dựng để làm tương đương với "cat-remote" và "tag-remote".
Conny

3
Tôi có cùng một vấn đề Tôi muốn có cùng một tệp giấy phép trong 2 repos; chỉnh sửa tập tin trong 1 repo sau đó để nó tự động cập nhật bản sao trong repo khác.
GlassGhost

Câu trả lời:


143

trong phiên bản git 1.7.9.5, điều này dường như hoạt động để xuất một tệp duy nhất từ ​​xa

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

Điều này sẽ cat nội dung của tập tin README.md.


27
... Ngoại trừ nó không hoạt động trên GitHub. Đăng. :( twitter.com/GitHubHelp/status/322818593748303873
Rob Howard

13
Điều này dường như không mang lại tệp thô mà là một tệp tar chỉ với một tệp duy nhất.
Frerich Raabe

20
@FrerichRaabe chỉ cần thêm `| tar -x` vào lệnh. git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -x cat README.md
renier

12
Bạn có thể sử dụng tar -xOđể xuất ra STDOUT cho đường ống, ví dụ:FILE=README.md && git archive --remote=ssh://host/pathto/repo.git HEAD "$FILE" | tar -xO "$FILE"
paulcm

2
Chính xác câu trả lời tôi đang tìm kiếm, nhưng tôi nhận được "gây tử vong: Hoạt động không được hỗ trợ bởi giao thức." để đáp lại từ Git. Argh.
mhvelplund

68

Theo dõi câu trả lời của Jakub . tạo ra một kho lưu trữ tar hoặc zip, vì vậy bạn cần dẫn đầu ra qua tar để có được nội dung tệp:git archive

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

Sẽ lưu một bản sao của 'tên tệp' từ ĐẦU của kho lưu trữ từ xa trong thư mục hiện tại.

Phần :path/to/directorynày là tùy chọn. Nếu bị loại trừ, tệp được tìm nạp sẽ được lưu vào<current working dir>/path/to/directory/filename

Ngoài ra, nếu bạn muốn cho phép sử dụng git archive --remotetrên kho Git được lưu trữ bởi git-daemon, bạn cần bật tùy chọn cấu hình daemon.uploadarch. Xem https://kernel.org/pub/software/scm/git/docs/git-daemon.html


2
Nếu nó là một tệp văn bản và chúng tôi muốn lưu nó vào một phần khác thì đó là ruột để sử dụng: | tar -xO> ~ / destfile.ext
yucer

44

Nếu có giao diện web được triển khai (như gitweb, cgit, Gitorious, ginatra), bạn có thể sử dụng nó để tải xuống một tệp (chế độ xem 'thô' hoặc 'đơn giản').

Nếu mặt khác kích hoạt nó , bạn có thể sử dụng tùy chọn 's' 'của git archive--remote=<URL> (và có thể giới hạn nó trong một thư mục cho tệp nằm trong), ví dụ:

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

Lưu ý: ví dụ không được kiểm tra!
Jakub Narębski

7
Đối với kho lưu trữ của riêng bạn, bạn cần kích hoạt lưu trữ tải lên cụ thể nếu sử dụng git-daemon (git: // kiểu url) với git config daemon.uploadarch truekho lưu trữ từ xa. Theo mặc định, git daemon vô hiệu hóa kho lưu trữ từ xa với "lỗi nghiêm trọng: lỗi từ xa: truy cập bị từ chối hoặc kho lưu trữ không được xuất: ..."
patthoyts

+1 Cách git archivetiếp cận là lần thử đầu tiên của tôi - nhưng sau đó tôi nhận thấy rằng yêu cầu tartrên máy khách không thực sự thuận tiện cho người dùng Windows. Chúng tôi đã kết thúc việc tìm nạp từ cgitmáy chủ địa phương của chúng tôi . Nó hoạt động, nhưng nó không nhanh như tôi mong muốn (và nó vẫn yêu cầu chạy unix2doshoặc tương tự trên các máy Windows vì chúng tôi lưu trữ các tệp có kết thúc dòng Unix trong kho Git).
Frerich Raabe

1
@FrerichRaabe Sử dụng -o fetched.zip. Cũng xem tùy chọn --format = <fmt>.
akhan

5
Đối với những gì nó có giá trị, nó không giống như điều này hoạt động trên kho lưu trữ được lưu trữ trên GitHub. Xem help.github.com/articles/can-i-archive-a-reposeectiveGroups.google.com/forum/#!topic/github/z8vLHcX0HxY
vmrob

30

Không nói chung nhưng nếu bạn đang sử dụng Github:

Đối với tôi wget, url thô hóa ra là cách tốt nhất và dễ nhất để tải xuống một tệp cụ thể.

Mở tệp trong trình duyệt và nhấp vào nút "Nguyên". Bây giờ hãy làm mới trình duyệt của bạn, sao chép url và thực hiện wgethoặc curltrên nó.

ví dụ

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

Ví dụ cuộn tròn:

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


3
Đây là giải pháp đơn giản nhất và hoạt động cho bất kỳ txt thô nào có thể tìm thấy. curl https://example.com/raw.txt > savedFile.txt
JacobPariseau

ví dụ wget không hoạt động, ví dụ curl không.
Kyle Baker

Hoạt động tốt cho tôi. Bạn đã đặt url của bạn trong dấu ngoặc kép trên dòng lệnh?
Ankur Agarwal

điều này không bảo tồn lịch sử git
crypdick

15

Để xuất một tệp từ xa:

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

Điều này sẽ tải tập tin README.mdvào thư mục hiện tại của bạn.

Nếu bạn muốn nội dung của tệp được xuất sang STDOUT:

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

Bạn có thể cung cấp nhiều đường dẫn ở cuối lệnh.


9

Nó có vẻ như là một giải pháp cho tôi: http : // git yet.com/interantly/2009/02/27/get-a-file-from-a-specific-revision.html

git show HEAD~4:index.html > local_file

trong đó 4có nghĩa là bốn sửa đổi từ bây giờ và ~là một dấu ngã như được đề cập trong bình luận.


Đảm bảo rằng đó không phải là 'dấu trừ' '-' giữa 'ĐẦU' và '4', mà là 'dấu ngã' '~'. Rõ ràng là tôi chưa đọc tài liệu git đủ tốt, hoặc kính của tôi cần cập nhật ;-)
Dennis

18
Điều này dường như không nhận được tệp từ một kho lưu trữ từ xa, như OP cần.
Mike Weller

Hoặc: git show HEAD:./my_other_file > local_filenếu tệp không nằm trong thư mục gốc của bạn :)
kenorb

1
Yêu cầu tử tế cho tất cả các downvoters - vui lòng giải thích và làm rõ những gì không ổn - chúng tôi ở đây để tìm hiểu và chia sẻ :)
Mars Robertson

9
@MichalStefanow: Mike Weller có nó; cụ thể, điều này không hoạt động trên một kho lưu trữ từ xa. Bạn cần một bản sao cục bộ ít nhất, ngay cả khi bạn có điều khiển từ xa được thiết lập trên nó.
Rob Howard

6

Tôi dùng cái này

$ 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'

Hoạt động với tôi ngay cả khi không có chỉnh sửa wgetrc:wget https://raw.github.com/bk322/bk_automates/master/bkubuntu/bkubuntu.bash
Adobe

1
Thông điệp của tôi hữu ích hơn: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
Điều này chỉ làm việc cho các kho lưu trữ công cộng. Đối với kho riêng bạn cần xác thực.
Ricardo Otero

5

Một biến thể sắc thái của một số câu trả lời ở đây trả lời câu hỏi của 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

Điều này không hoạt động, github không hỗ trợ lưu trữ git.
Philipp Flenker

2
Err .. git được sử dụng không chỉ cho GitHub
Willem van Ketwich

1
Mặc dù vậy, bạn đặt rõ ràng - ghi lại một URL github trong câu trả lời của bạn ;-)
Philipp Flenker

1
Cảm ơn vì bạn đã phản hồi. Đã sửa đổi câu trả lời cho phù hợp.
Willem van Ketwich

2

Nếu kho lưu trữ của bạn hỗ trợ mã thông báo (ví dụ GitLab), sau đó tạo mã thông báo cho người dùng của bạn, sau đó điều hướng đến tệp bạn sẽ tải xuống và nhấp vào đầu ra RAW để lấy URL. Để tải tập tin, sử dụng:

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

2

Tôi đã giải quyết theo cách này:

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

Nếu bạn muốn, bạn có thể thay thế "BranchName" cho "HEAD"


2

Dường như với tôi cách dễ nhất để sử dụng như sau:

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

1

Câu trả lời của Yisrael Dov là câu trả lời đơn giản, nhưng nó không cho phép nén. Bạn có thể sử dụng --format=zip, nhưng bạn không thể giải nén trực tiếp bằng lệnh pipe như bạn có thể với tar, vì vậy bạn cần lưu nó dưới dạng tệp tạm thời. Đây là một kịch bản:

#!/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

Điều này làm việc với các thư mục quá.


1

Đối với tập tin duy nhất, chỉ cần sử dụng lệnh wget.

Đầu tiên, hãy làm theo pic bên dưới để nhấp vào "raw" để lấy url, nếu không bạn sẽ tải xuống mã được nhúng trong html. nhập mô tả hình ảnh ở đây

Sau đó, trình duyệt sẽ mở một trang mới với url bắt đầu bằng https://raw.githubusercontent.com/ ...

chỉ cần nhập lệnh trong terminal:

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

Một lúc các tập tin sẽ đặt trong thư mục của bạn.


Đúng, điều này cũng hoạt động tốt trong Python hoặc các ngôn ngữ lập trình khác, với chức năng REST-funcionality. Ví dụ: để tải xuống các mô-đun từ các kho lưu trữ khác nhau ..
Lars GJ

1

Nếu kho lưu trữ Git của bạn được lưu trữ trên Azure-DevOps (VSTS), bạn có thể truy xuất một tệp duy nhất bằng API nghỉ ngơi .

Định dạng của API này trông như thế này:

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

Ví dụ:

 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

Nó yêu cầu mã thông báo api, phải không?
Yuriy Pozniak

Phụ thuộc vào cách bạn chạy api
Shayki Abramchot

0

Tôi sử dụng curl, nó hoạt động với repos công khai hoặc những người sử dụng xác thực cơ bản https thông qua giao diện web.

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

Tôi đã thử nghiệm nó trên github và bitbucket, hoạt động trên cả hai.


0

Nếu bạn muốn lấy một tệp từ một hàm băm cụ thể + kho lưu trữ từ xa tôi đã thử git-archive và nó không hoạt động.

Bạn sẽ phải sử dụng git clone và một khi kho lưu trữ được sao chép, bạn sẽ phải sử dụng git-archive để làm cho nó hoạt động.

Tôi gửi một câu hỏi về cách làm nó đơn giản hơn trong kho lưu trữ git từ một hàm băm cụ thể từ xa


0

cho bitbucket trực tiếp từ trình duyệt (tôi đã sử dụng safari ...) nhấp chuột phải vào 'Xem Raw "và chọn" Tải xuống tệp được liên kết ":

nhập mô tả hình ảnh ở đây


0

Nếu bạn không nhớ sao chép toàn bộ thư mục, hàm bash / zsh nhỏ này sẽ có kết quả cuối cùng là sao chép một tệp vào thư mục hiện tại của bạn (bằng cách sao chép repo vào thư mục tạm thời và xóa nó sau đó).

Pro: Bạn chỉ nhận được tệp bạn muốn

Con: Bạn vẫn phải đợi toàn bộ repo sao chép

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
}

Câu trả lời này có thể giúp làm cho bản sao thưa thớt, đó là không có chi phí.
Yuriy Pozniak

0

Giải pháp doanh nghiệp Github

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}"

Chúng ta tìm thấy ở GITHUB_PERSONAL_ACCESS_TOKENđâu?
ShadSterling

1
Bạn có thể tạo mã thông báo truy cập cá nhân bằng cách truy cập https: // <your-github-server> / settings / token và nhấn nút "Tạo mã thông báo mới".
Oliver Pearmain

Hmm, chúng tôi có các thiết bị tự động được cung cấp tên người dùng và mật khẩu, được sử dụng để xác thực cho nhiều hệ thống sử dụng cùng một SSO, vì vậy tôi hy vọng sẽ có cách tự động tạo mã thông báo cho tên người dùng và mật khẩu.
ShadSterling

0

Nếu mục tiêu của bạn chỉ là tải xuống tệp, có một ứng dụng không rắc rối có tên gget:

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

Ví dụ trên sẽ tải xuống tập tin duy nhất từ hugokho lưu trữ.

https://github.com/dpb587/gget


-1

Liên quan đến câu trả lời của @Steven Penny, tôi cũng sử dụng wget. Hơn nữa, để quyết định tập tin nào sẽ gửi đầu ra cho tôi sử dụng -O.

Nếu bạn đang sử dụng gitlabs, một khả năng khác cho url là:

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

Trừ khi bạn có chứng chỉ hoặc bạn truy cập từ một máy chủ đáng tin cậy để cài đặt gitlabs mà bạn cần - không kiểm tra-chứng nhận như @Kos nói. Tôi thích điều đó hơn là sửa đổi .wgetrc nhưng nó phụ thuộc vào nhu cầu của bạn.

Nếu đó là một tệp lớn, bạn có thể cân nhắc sử dụng tùy chọn -c với wget. Để có thể tiếp tục tải xuống tệp từ nơi bạn để lại nếu ý định trước đó không thành công ở giữa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.