저장소에서 단일 파일 검색


221

원격 git 저장소에서 단일 파일의 내용을 가져 오는 가장 효율적인 메커니즘 (전송 된 데이터 및 사용 된 디스크 공간)은 무엇입니까?

지금까지 나는 생각해 냈습니다.

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

이것은 여전히 ​​과잉으로 보입니다.

리포지토리에서 여러 파일을 가져 오는 것은 어떻습니까?


3
아아 "cat-remote"와 "tag-remote"와 동등한 방법으로 내장 된 것이 있으면 좋겠습니다.
conny

3
2 번의 repos에 동일한 라이센스 파일을 갖고 싶은 동일한 문제가 있습니다. 1 repo에서 파일을 편집 한 다음 다른 repo에서 사본을 자동으로 업데이트하십시오.
GlassGhost

답변:


144

자식 버전 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
@FrerichRaabe는 단지`| 명령에 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 8

68

에 이어 야쿱대답 . git archivetar 또는 zip 아카이브를 생성하므로 파일 내용을 가져 오려면 tar를 통해 출력을 파이프해야합니다.

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

현재 디렉토리에있는 원격 저장소의 HEAD에서 'filename'의 사본을 저장합니다.

:path/to/directory부분은 선택 사항입니다. 제외 된 경우 가져온 파일은<current working dir>/path/to/directory/filename

또한 git archive --remotegit-daemon이 호스팅하는 Git 리포지토리를 사용하려면 daemon.uploadarch 구성 옵션을 활성화해야합니다. https://kernel.org/pub/software/scm/git/docs/git-daemon.html을 참조 하십시오


2
텍스트 파일이고 다른 부분에 저장하려면 다음을 사용하십시오. | tar -xO> ~ / destfile.ext
yucer

44

웹 인터페이스 가있는 경우 배치는 (gitweb이 CGIT, Gitorious, ginatra 같이), 당신은 하나의 파일을 다운로드하는 데 사용할 수 있습니다 ( '원시'또는 '일반'보기).

다른 측면이 있다면 그것을 활성화 , 당신이 사용할 수있는 자식 아카이브 의 ' --remote=<URL>'옵션을 (그리고 아마도 디렉토리 주어진 파일이 상주로 제한) 예를 들어, :

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

참고 :이 예제는 테스트되지 않았습니다!
Jakub Narębski

7
자체 저장소의 경우 git config daemon.uploadarch true원격 저장소에서 git-daemon (git : // style urls)을 사용하는 경우 업로드 아카이브를 구체적으로 활성화해야 합니다. 기본적으로 git 데몬은 "치명적 : 원격 오류 : 액세스 거부 또는 리포지토리가 내 보내지 않음 : ..."으로 원격 아카이브를 비활성화합니다.
patthoyts

+1이 git archive방법은 첫 번째 시도 였지만 tar클라이언트 컴퓨터에서 요구 하는 것이 Windows 사용자에게는 정확하지 않은 것으로 나타났습니다 . 로컬 cgit서버 에서 가져 왔습니다 . 작동하지만 속도가 빠르지는 않습니다 ( unix2dosGit 저장소에 Unix 줄 끝이있는 파일을 저장 하기 때문에 여전히 Windows 컴퓨터에서 실행 하거나 유사 해야 합니다).
Frerich Raabe

1
@FrerichRaabe -o fetched.zip을 사용하십시오. --format = <fmt> 옵션도 참조하십시오.
akhan

5
가치있는 것은 GitHub 호스팅 리포지토리에서 작동하는 것처럼 보이지 않습니다. 참조 help.github.com/articles/can-i-archive-a-repositorygroups.google.com/forum/#!topic/github/z8vLHcX0HxY
vmrob

30

일반적으로 아니지만 Github을 사용하는 경우 :

나를 wget위해 원시 URL은 하나의 특정 파일을 다운로드하는 가장 쉽고 쉬운 방법으로 밝혀졌습니다.

브라우저에서 파일을 열고 "Raw"버튼을 클릭하십시오. 이제 브라우저를 새로 고침하고 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
JacobPariseau

wget 예제가 작동하지 않지만 curl 예제는 작동하지 않습니다.
Kyle Baker

나를 위해 잘 작동합니다. 커맨드 라인에 따옴표를 넣었습니까?
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'사이의 '빼기 기호' '-'가 아니라 '물결표' '~'입니다. 분명히 git 문서를 충분히 읽지 못했거나 안경을 업데이트해야합니다. ;-)
Dennis

18
그러나 OP 요구 사항과 같이 원격 저장소에서 파일을 가져 오는 것 같지 않습니다.
Mike Weller

또는 : git show HEAD:./my_other_file > local_file파일이 루트 디렉토리에없는 경우 :)
kenorb

1
모든 downvoters에 대한 친절 요청-설명하지 말고 무엇이 잘못되었는지 설명하십시오-우리는 배우고 공유하기 위해 여기에 있습니다 :)
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 조정 없이도 저에게 효과적입니다.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 archive를 지원하지 않습니다.
Philipp Flenker

2
Err .. git은 GitHub 그 이상을 위해 사용되었습니다
Willem van Ketwich

1
;-)하지만 대답에서 --remote를 github URL로 명시 적으로 설정했습니다.
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

원하는 경우 "HEAD"의 "BranchName"을 바꿀 수 있습니다


2

다음을 사용하는 가장 쉬운 방법은 다음과 같습니다.

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

1

이스라엘 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 명령을 사용하십시오.

먼저 아래 그림을 따라 "raw"를 클릭하여 URL을 가져 오십시오. 그렇지 않으면 html에 포함 된 코드를 다운로드합니다. 여기에 이미지 설명을 입력하십시오

그런 다음 브라우저는 https://raw.githubusercontent.com/으로 시작하는 URL로 새 페이지를 엽니 다 .

터미널에 명령을 입력하십시오.

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

잠시 동안 파일이 폴더에 저장됩니다.


그렇습니다.이 기능은 Python 또는 다른 프로그래밍 언어에서 REST 기능을 사용하여 훌륭하게 작동합니다. 예를 들어 다른 저장소에서 모듈을 다운로드하는 경우.
Lars GJ

1

VSTS (Azure-DevOps)에서 호스팅되는 Git 리포지토리 인 경우 Rest 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 '11

당신이 API를 실행하는 방법에 따라 달라집니다
Shayki Abramczyk

0

curl을 사용합니다. 공개 저장소 또는 웹 인터페이스를 통한 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 archive에서 더 간단하게 수행하는 방법에 대한 질문을 게시합니다.


0

브라우저에서 직접 비트 버킷을 사용하려면 (Safari 사용) ... '원시보기'를 마우스 오른쪽 단추로 클릭하고 "링크 된 파일 다운로드"를 선택하십시오.

여기에 이미지 설명을 입력하십시오


0

전체 디렉토리를 복제하지 않아도된다면,이 작은 bash / zsh 함수는 단일 디렉토리를 현재 디렉토리로 복제하는 최종 결과를 갖게됩니다 (리포지를 임시 디렉토리로 복제 한 후 나중에 제거하여).

Pro : 원하는 파일 만 가져옵니다

단점 : 여전히 전체 레포가 복제 될 때까지 기다려야합니다.

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 엔터프라이즈 솔루션

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가 말한대로 --no-check-certificate가 필요합니다. .wgetrc를 수정하는 대신 선호하지만 요구 사항에 따라 다릅니다.

큰 파일 인 경우 wget과 함께 -c 옵션을 사용하는 것이 좋습니다. 이전 의도가 중간에 실패한 경우 파일을 남은 위치에서 파일을 계속 다운로드 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.