programing

리포지토리에서 단일 파일 검색

powerit 2023. 7. 7. 21:11
반응형

리포지토리에서 단일 파일 검색

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

지금까지 제가 생각해낸 것은 다음과 같습니다.

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

이건 여전히 과잉 살상인 것 같습니다.

repo에서 여러 개의 파일을 가져오는 것은 어떻습니까?

Git 버전 1.7.9.5에서는 원격에서 단일 파일을 내보내는 데 사용할 수 있는 것 같습니다.

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

됩니다.README.md.

Jakub대답에 이어서. 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 --remotegit-daemon에서 호스팅하는 Git 저장소에서 daemon.uploadarch 구성 옵션을 사용하도록 설정해야 합니다.https://kernel.org/pub/software/scm/git/docs/git-daemon.html 을 참조하십시오.

인터페이스(예: gitweb, cgit, Gotorit, ginatra)가 배포된 경우 이를 사용하여 단일 파일('raw' 또는 'plain' 보기)을 다운로드할 수 있습니다.

다른 쪽에서 활성화한 경우 Git Archive의 '를 사용할 수 있습니다.--remote=<URL>옵션(및 파일이 위치한 디렉토리로 제한 가능), 예:

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

일반적으로 그렇지는 않지만 Github을 사용하는 경우:

나를 위해.wgetraw 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

원격에서 단일 파일을 내보내는 방법

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

명령 끝에 여러 경로를 제공할 수 있습니다.

저는 다음과 같은 방법으로 해결했습니다.

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"로 바꿀 수 있습니다.

게는 해결책인 것 같습니다. 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개의 개정을 의미합니다.~댓글에 언급된 대로 타일입니다.

다른 답변(예: 제한적 GitLab 액세스)이 작동하지 않는 경우 다음 방법으로 "선택적 체크아웃"을 수행할 수 있습니다.

  1. git clone --no-checkout --depth=1 --no-tags URL
  2. git restore --staged DIR-OR-FILE
  3. git checkout DIR-OR-FILE

이 솔루션은 100% Git 호환되며 디렉터리를 체크아웃할 수 있지만 파일에서 wget/curl을 수행하는 것만큼 디스크나 네트워크가 최적화되지는 않습니다.

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

사용합니다.

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

다음을 사용하는 가장 쉬운 방법으로 보입니다.

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

저장소에서 토큰을 지원하는 경우(예: 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

단일 파일의 경우 wget 명령을 사용합니다.

먼저 아래 그림을 따라 "raw"를 클릭하여 URL을 가져오십시오. 그렇지 않으면 HTML에 포함된 코드를 다운로드할 수 있습니다.enter image description here

그러면 브라우저에서 URL이 https://raw.githubusercontent.com/ 으로 시작하는 새 페이지가 열립니다.

터미널에 명령을 입력하면 됩니다.

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

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

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

다음 두 가지 명령이 저에게 효과가 있었습니다.

git archive --remote={remote_repo_git_url} {branch} {file_to_download} -o {tar_out_file}

다드로file_to_download~하듯이tar에서 합니다.branch이 url인 원격 remote_repo_git_url에 합니다.tar_out_file

tar -x -f {tar_out_file}.tar을 합니다.file_to_downloadtar_out_file

GitHub에서 호스팅되는 Git Repos에 대한 특정 정보입니다.

Github의 명령줄 앱의 'api' 명령어를 사용해 보십시오.ghGithub의 '리포지토리 콘텐츠 가져오기' 끝점에 인증된 호출을 수행합니다.

기본 명령은 다음과 같습니다.

$gh api /repos/{owner}/{repo}/contents/<path_to_the_file>

추가적으로 파일을 가져오려는 repo의 복제본이 포함된 디렉토리 내에서 이 작업을 수행하면 {owner} 및 {repo} 부분이 자동으로 채워집니다.

https://docs.github.com/en/rest/reference/repos#get-repository-content

응답은 JSON 개체가 됩니다.<path_to_the_file>이 실제로 파일을 가리킨다면, JSON은 파일에 액세스하기 위한 'size', 'name', 여러 url 필드와 파일 내용의 기본 64 인코딩 버전인 'content' 필드를 포함합니다.

파일 내용을 가져오려면 "download_url"의 값을 구르거나 'content' 필드를 디코딩하면 됩니다.다음과 같이 base64 명령을 파이프로 연결하여 이를 수행할 수 있습니다.

$gh api /repos/{owner}/{repo}/contents/<path-to-the-file> --jq '.content' | base64 -d

저는 컬을 사용하며, 공용 저장소 또는 웹 인터페이스를 통해 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에서 테스트해봤는데, 둘 다 작동합니다.

이스라엘 도브의 대답은 간단하지만 압축을 허용하지 않습니다.사용할 수 있습니다.--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

이것은 디렉터리에서도 작동합니다.

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

특정 해시 + 원격 저장소에서 파일을 가져오려면 git-archive를 시도했지만 작동하지 않았습니다.

git clone을 사용해야 하며 저장소가 복제되면 git-archive를 사용하여 작동해야 합니다.

원격의 특정 해시에서 더 단순한 igit 아카이브를 수행하는 방법에 대한 질문을 게시합니다.

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

enter image description here

전체 디렉터리를 복제하는 데 문제가 없다면, 이 작은 bash/zsh 함수를 사용하면 단일 파일을 현재 디렉터리에 복제할 수 있습니다(레포를 임시 디렉터리로 복제한 후 제거함).

찬성: 원하는 파일만 얻을 수 있습니다.

반대: 전체 보고서가 복제될 때까지 기다려야 합니다.

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
}

만약 당신의 목표가 단지 파일을 다운로드하는 것이라면, 번거롭지 않은 애플리케이션이 있습니다.gget:

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

위의 예는 단일 파일을 다운로드합니다.hugo저장소

https://github.com/dpb587/gget

@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 옵션을 사용하는 것을 고려할 수 있습니다.이전 의도가 중간에 실패한 경우 파일을 둔 위치에서 계속 다운로드할 수 있습니다.

언급URL : https://stackoverflow.com/questions/1125476/retrieve-a-single-file-from-a-repository

반응형