git repo에서 하나의 파일 만 체크 아웃하려면 어떻게해야합니까?
git repo에서 하나의 파일 만 체크 아웃하려면 어떻게해야합니까?
답변:
원래, 나는 2012 년에 언급 git archive
(참조 자레드 포 시스 의 대답 과 로버트 기사 의 대답을 하기 때문에) git1.7.9.5 (2012 월) , 폴 Brannan 의 대답 :
git archive --format=tar --remote=origin HEAD:path/to/directory -- filename | tar -O -xf -
그러나 2013 년에는 더 이상 원격 https://github.com URL에 사용할 수 없었습니다 .
이전 페이지 " 저장소를 아카이브 할 수 있습니까? "를 참조하십시오.
현재 (2018) 페이지 " GitHub의 콘텐츠 및 데이터 보관 정보 "에서는 GHTorrent 또는 GH Archive 와 같은 타사 서비스를 사용할 것을 권장 합니다.
따라서 로컬 복사본 / 복제를 처리 할 수도 있습니다.
에서 언급 한대로 베어 저장소의 로컬 복사본이있는 경우 선택적으로 다음을 할 수있는 이 답변 ,
git --no-pager --git-dir /path/to/bar/repo.git show branch:path/to/file >file
또는 먼저 리포지토리를 복제해야합니다. 즉, 작업 트리에서 전체 기록을 가져옵니다.-.git 리포지토리-
git config core.sparsecheckout true
).git/info/sparse-checkout
파일 에서보고 싶은 것을 추가작업 트리를 다시 읽으려면 :
$ git read-tree -m -u HEAD
그렇게하면 원하는 파일을 정확히 포함하는 작업 트리가 생깁니다 (파일이 하나 인 경우에도)
리처드 고메스 (포인트 코멘트에 )에 " 나는 복제, 가져 않는 방법 또는 스파 스 체크 아웃 한 디렉토리 또는 자식 저장소 디렉토리의 목록을? "
히스토리 다운로드를 피하는 bash 함수는 단일 브랜치를 검색하고 필요한 파일 또는 디렉토리 목록을 검색합니다.
git archive
지금 사용할 수 있습니다 .
먼저 모든 파일의 기본 체크 아웃을 억제하는 -n 옵션과 --depth 1 옵션을 사용하여 repo를 복제하십시오. 즉, 각 파일의 최신 개정 만 가져옵니다.
git clone -n git://path/to/the_repo.git --depth 1
그런 다음 원하는 파일 만 확인하십시오.
cd the_repo
git checkout HEAD name_of_file
-n
작업 트리와 색인이 동기화됩니다. 즉, 모든 컨텐츠가 삭제 된 것으로 나타납니다. git reset HEAD
또는 중 하나를 수행해야합니다 git checkout HEAD file
. git의 작동 방식을 실제로 이해하지 않으면이 시점에서 저장소로 작업하는 것이 실제로 어렵습니다.
rm -rf .git
NickMoore의 스크립트에 추가 하면 복제 된 Repo의 모든 흔적을 정리하고 Jefromi의 사용하기 어려운 리포지토리에 대한 우려를 해결할 수 있습니다. 수신 후 후크를 생성하여 다른 수신 후 후크 자동 마술의 버전을 업데이트해야하는 오늘날의 과제와 같은 여러 응용 프로그램에 매우 유용합니다.
이미 git repo 사본이있는 경우 항상 a git log
를 사용하여 파일 버전을 체크 아웃하여 해시 ID를 찾으십시오 (예 : 3cdc61015724f9965575ba954c8cd4232c8b42e4).
git checkout hash-id path-to-file
실제 예는 다음과 같습니다.
git checkout 3cdc61015724f9965575ba954c8cd4232c8b42e4 /var/www/css/page.css
path-to-file
디렉토리이고 current HEAD
에 특정 파일이 포함되어 있지만 target
그렇지 않은 경우 파일 이 올바르게 업데이트되지 않습니다. 처리 할 수있는 방법이 있습니까?
일반적으로 git
첫 번째 답변에서 제안한 것처럼 전체 저장소를 다운로드하지 않고 하나의 파일 만 다운로드 할 수는 없습니다 . Git은 CVS / SVN처럼 생각대로 파일을 저장하지 않지만 프로젝트의 전체 기록을 기반으로 파일을 생성하기 때문입니다.
그러나 특정 경우에 대한 해결 방법이 있습니다. 에 대한 자리로 아래의 예를 들면 user
, project
, branch
, filename
.
깃 허브
wget https://raw.githubusercontent.com/user/project/branch/filename
GitLab
wget https://gitlab.com/user/project/raw/branch/filename
GitWeb
Server-GitWeb 에서 Git을 사용하는 경우 예를 들어 시도 할 수 있습니다 (올바른 경로로 변경).
wget "http://example.com/gitweb/?p=example;a=blob_plain;f=README.txt;hb=HEAD"
drupalcode.org의 GitWeb
예:
wget "http://drupalcode.org/project/ads.git/blob_plain/refs/heads/master:/README.md"
googlesource.com
base64 인코딩 버전의 원시 파일을 다운로드 할 수있는 문서화되지 않은 기능이 있습니다.
curl "https://chromium.googlesource.com/chromium/src/net/+/master/http/transport_security_state_static.json?format=TEXT" | base64 --decode
다른 경우에는 Git 리포지토리가 웹 인터페이스를 사용하고 있는지 확인하십시오.
이 모든 웹 인터페이스를 사용하지 않는 것, 당신과 같은 외부 서비스에 코드를 밀어 고려할 수 GitHub의 , 의 Bitbucket , 등 . 거울로 사용하십시오.
wget
설치 하지 않은 경우 curl -O (url)
다른 방법으로 시도하십시오 .
wget
하여 행복과 함께이 훌륭한 답변과 단순함을 찾으십시오 . 고마워요
git-checkout
.
이제 할 수 있습니다! 이것이 Google의 첫 번째 결과이므로 최신 상태로 업데이트한다고 생각했습니다. git 1.7.9.5의 출현으로 git archive
, 원격 호스트에서 단일 파일을 검색 할 수 있는 명령이 있습니다.
git archive --remote=git://git.foo.com/project.git HEAD:path/in/repo filename | tar -x
https://stackoverflow.com/a/5324532/290784 에서 전체 답변을 참조 하십시오.
github.com
HEAD
또는 master
not HEAD:directory
입니다.
git archive --remote=git@bitbucket.org:user/repo branch:path/to file | tar -x
GIT 1.7.2.2에서 작업
예를 들어 분기가 branch1 인 원격 some_remote 가 있습니다 . branch32
특정 파일을 체크 아웃하려면이 명령을 호출하십시오.
git checkout remote/branch path/to/file
예를 들어 다음과 같습니다.
git checkout some_remote/branch32 conf/en/myscript.conf
git checkout some_remote/branch1 conf/fr/load.wav
이 체크 아웃 명령은 전체 파일 구조 conf / en 및 conf / fr을이 명령을 호출하는 현재 디렉토리에 복사합니다 (물론 이전에는 어느 시점에서 git init를 실행했다고 가정합니다)
git fetch some_remote
전에 달리기해야 합니까?
매우 간단합니다 :
git checkout from-branch-name -- path/to/the/file/you/want
이것은 체크 아웃되지 않습니다 from-branch-name
지점을 . 어떤 브랜치에 있더라도 지정된 브랜치에서 해당 단일 파일 만 체크 아웃됩니다.
다음은 맨 페이지의 관련 부분입니다. git-checkout
git checkout [-p|--patch] [<tree-ish>] [--] <pathspec>...
When <paths> or --patch are given, git checkout does not switch
branches. It updates the named paths in the working tree from the
index file or from a named <tree-ish> (most often a commit). In
this case, the -b and --track options are meaningless and giving
either of them results in an error. The <tree-ish> argument can be
used to specify a specific tree-ish (i.e. commit, tag or tree) to
update the index for the given paths before updating the working
tree.
이 블로그 포스트 에서 저를 가르쳐 준 Ariejan de Vroom의 모자 팁 .
git clone --filter
힘내 2.19에서
이 옵션은 실제로 서버에서 불필요한 객체를 가져 오는 것을 건너 뜁니다.
git clone --depth 1 --no-checkout --filter=blob:none \
"file://$(pwd)/server_repo" local_repo
cd local_repo
git checkout master -- mydir/myfile
서버는 다음과 같이 구성되어야합니다.
git config --local uploadpack.allowfilter 1
git config --local uploadpack.allowanysha1inwant 1
v2.19.0부터 서버 지원은 없지만 이미 로컬에서 테스트 할 수 있습니다.
TODO : --filter=blob:none
모든 얼룩을 건너 뛰지 만 여전히 모든 트리 개체를 가져옵니다. 그러나 정상적인 저장소에서는 파일 자체와 비교할 때 크기가 작아야하므로 이미 충분합니다. 질문 : https://www.spinics.net/lists/git/msg342006.html 개발자가 대답했습니다.--filter=tree:0
가 작업 .
--depth 1
이미 의미 함을 기억 --single-branch
하십시오. Git에서 단일 분기를 어떻게 복제합니까?
file://$(path)
git clone
프로토콜 shenanigans 를 극복하기 위해 필요합니다 : 상대 경로로 로컬 자식 저장소를 얕은 복제하는 방법은 무엇입니까?
의 형식 --filter
은 문서화되어 있습니다man git-rev-list
있습니다.
이 기능을 지원하기 위해 Git 원격 프로토콜이 확장되었습니다.
힘내 나무에 대한 문서 :
그것을 테스트
#!/usr/bin/env bash
set -eu
list-objects() (
git rev-list --all --objects
echo "master commit SHA: $(git log -1 --format="%H")"
echo "mybranch commit SHA: $(git log -1 --format="%H")"
git ls-tree master
git ls-tree mybranch | grep mybranch
git ls-tree master~ | grep root
)
# Reproducibility.
export GIT_COMMITTER_NAME='a'
export GIT_COMMITTER_EMAIL='a'
export GIT_AUTHOR_NAME='a'
export GIT_AUTHOR_EMAIL='a'
export GIT_COMMITTER_DATE='2000-01-01T00:00:00+0000'
export GIT_AUTHOR_DATE='2000-01-01T00:00:00+0000'
rm -rf server_repo local_repo
mkdir server_repo
cd server_repo
# Create repo.
git init --quiet
git config --local uploadpack.allowfilter 1
git config --local uploadpack.allowanysha1inwant 1
# First commit.
# Directories present in all branches.
mkdir d1 d2
printf 'd1/a' > ./d1/a
printf 'd1/b' > ./d1/b
printf 'd2/a' > ./d2/a
printf 'd2/b' > ./d2/b
# Present only in root.
mkdir 'root'
printf 'root' > ./root/root
git add .
git commit -m 'root' --quiet
# Second commit only on master.
git rm --quiet -r ./root
mkdir 'master'
printf 'master' > ./master/master
git add .
git commit -m 'master commit' --quiet
# Second commit only on mybranch.
git checkout -b mybranch --quiet master~
git rm --quiet -r ./root
mkdir 'mybranch'
printf 'mybranch' > ./mybranch/mybranch
git add .
git commit -m 'mybranch commit' --quiet
echo "# List and identify all objects"
list-objects
echo
# Restore master.
git checkout --quiet master
cd ..
# Clone. Don't checkout for now, only .git/ dir.
git clone --depth 1 --quiet --no-checkout --filter=blob:none "file://$(pwd)/server_repo" local_repo
cd local_repo
# List missing objects from master.
echo "# Missing objects after --no-checkout"
git rev-list --all --quiet --objects --missing=print
echo
echo "# Git checkout fails without internet"
mv ../server_repo ../server_repo.off
! git checkout master
echo
echo "# Git checkout fetches the missing file from internet"
mv ../server_repo.off ../server_repo
git checkout master -- d1/a
echo
echo "# Missing objects after checking out d1/a"
git rev-list --all --quiet --objects --missing=print
힘내 v2.19.0의 출력 :
# List and identify all objects
c6fcdfaf2b1462f809aecdad83a186eeec00f9c1
fc5e97944480982cfc180a6d6634699921ee63ec
7251a83be9a03161acde7b71a8fda9be19f47128
62d67bce3c672fe2b9065f372726a11e57bade7e
b64bf435a3e54c5208a1b70b7bcb0fc627463a75 d1
308150e8fddde043f3dbbb8573abb6af1df96e63 d1/a
f70a17f51b7b30fec48a32e4f19ac15e261fd1a4 d1/b
84de03c312dc741d0f2a66df7b2f168d823e122a d2
0975df9b39e23c15f63db194df7f45c76528bccb d2/a
41484c13520fcbb6e7243a26fdb1fc9405c08520 d2/b
7d5230379e4652f1b1da7ed1e78e0b8253e03ba3 master
8b25206ff90e9432f6f1a8600f87a7bd695a24af master/master
ef29f15c9a7c5417944cc09711b6a9ee51b01d89
19f7a4ca4a038aff89d803f017f76d2b66063043 mybranch
1b671b190e293aa091239b8b5e8c149411d00523 mybranch/mybranch
c3760bb1a0ece87cdbaf9a563c77a45e30a4e30e
a0234da53ec608b54813b4271fbf00ba5318b99f root
93ca1422a8da0a9effc465eccbcb17e23015542d root/root
master commit SHA: fc5e97944480982cfc180a6d6634699921ee63ec
mybranch commit SHA: fc5e97944480982cfc180a6d6634699921ee63ec
040000 tree b64bf435a3e54c5208a1b70b7bcb0fc627463a75 d1
040000 tree 84de03c312dc741d0f2a66df7b2f168d823e122a d2
040000 tree 7d5230379e4652f1b1da7ed1e78e0b8253e03ba3 master
040000 tree 19f7a4ca4a038aff89d803f017f76d2b66063043 mybranch
040000 tree a0234da53ec608b54813b4271fbf00ba5318b99f root
# Missing objects after --no-checkout
?f70a17f51b7b30fec48a32e4f19ac15e261fd1a4
?8b25206ff90e9432f6f1a8600f87a7bd695a24af
?41484c13520fcbb6e7243a26fdb1fc9405c08520
?0975df9b39e23c15f63db194df7f45c76528bccb
?308150e8fddde043f3dbbb8573abb6af1df96e63
# Git checkout fails without internet
fatal: '/home/ciro/bak/git/test-git-web-interface/other-test-repos/partial-clone.tmp/server_repo' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
# Git checkout fetches the missing directory from internet
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1/1), 45 bytes | 45.00 KiB/s, done.
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1/1), 45 bytes | 45.00 KiB/s, done.
# Missing objects after checking out d1
?f70a17f51b7b30fec48a32e4f19ac15e261fd1a4
?8b25206ff90e9432f6f1a8600f87a7bd695a24af
?41484c13520fcbb6e7243a26fdb1fc9405c08520
?0975df9b39e23c15f63db194df7f45c76528bccb
결론 : 제외한 모든 얼룩이 d1/a
없습니다. 예를 들어 f70a17f51b7b30fec48a32e4f19ac15e261fd1a4
, d1/b
체크 아웃 한 후에는 없습니다d1/
.
참고 root/root
및 mybranch/mybranch
도 누락,하지만 --depth 1
가죽이 누락 된 파일 목록에서. 를 제거하면 --depth 1
누락 된 파일 목록에 표시됩니다.
git에서는 파일을 업데이트하기 전에 '체크 아웃'하지 않습니다 . 이것이 당신이 따르는 것 같습니다.
clearcase, csv 등과 같은 많은 시스템에서는 파일을 변경하기 전에 파일을 '체크 아웃'해야합니다. 힘내는 이것을 요구하지 않습니다. 저장소를 복제 한 다음 로컬 저장소 사본을 변경하십시오.
파일을 업데이트하면 다음을 수행 할 수 있습니다.
git status
어떤 파일이 수정되었는지 확인합니다. index
먼저 커밋하려는 것을 추가하십시오 ( index
체크 인 목록과 같습니다).
git add .
또는
git add blah.c
그러면 git status
수정 된 파일과 index
커밋 또는 체크인 할 준비 가 된 파일이 표시 됩니다.
저장소 사본에 파일을 커미트하려면 다음을 수행하십시오.
git commit -a -m "commit message here"
설명서 및 안내서 링크는 git
웹 사이트 를 참조하십시오 .
git format-patch
제출할 패치를 작성하는 데 사용해야 합니다 ( git format-patch -1
패치 작성). 가장 최근의 커밋에 대해서만).
다음은 git 저장소 내에서 특정 파일 만 가져오고 밀어 넣는 완벽한 솔루션입니다.
git clone --no-checkout <git url>
git reset
git checkout origin/master <path to file>
git add <path to file>
git commit -m <message text>
git push
추가 정보에 대한 링크 도 참조하십시오 .
원격 Git 저장소의 특정 브랜치 에서 특정 파일이 필요한 경우 명령은 다음과 같습니다.
git archive --remote=git://git.example.com/project.git refs/heads/mybranch path/to/myfile |tar xf -
나머지는 @VonC의 답변에서 파생 될 수 있습니다.
마스터 브랜치에서 특정 파일이 필요한 경우 다음과 같습니다.
git archive --remote=git://git.example.com/project.git HEAD path/to/myfile |tar xf -
태그에서 특정 파일이 필요한 경우 다음과 같습니다.
git archive --remote=git://git.example.com/project.git mytag path/to/myfile |tar xf -
나는 여기에 나와있는 것이 무엇인지 알지 못하므로 누군가 내 상황에있을 때 포함시킬 것입니다.
내 상황에는 10,000 개 파일의 원격 저장소가 있으며 Linux 시스템 용 RPM 파일을 빌드해야합니다. RPM 빌드에는 모든 것의 git clone이 포함됩니다. RPM 빌드를 시작하려면 하나의 파일 만 있으면됩니다. 필요한 모든 작업을 수행하는 전체 소스 트리를 복제 할 수 있지만 필요한 파일이 하나 인 경우 모든 파일을 다운로드하는 데 2 분이 더 걸립니다. 논의 된 git archive 옵션을 사용하려고하는데 "치명적 : 작업이 프로토콜에서 지원되지 않습니다"라는 메시지가 나타납니다. 서버에서 일종의 아카이브 옵션을 활성화 해야하는 것처럼 보이며 내 서버는 작업을 수행하는 것을 어렵게하는 관료적 깡패에 의해 유지 관리됩니다.
마지막으로 비트 버킷의 웹 인터페이스로 이동하여 필요한 파일 하나를 보았습니다. 링크를 마우스 오른쪽 버튼으로 클릭하여 파일의 원시 사본을 다운로드하고 결과 팝업에서 "복사본 바로 가기"를 선택했습니다. 자동화해야했기 때문에 원시 파일을 다운로드 할 수 없었으며 Linux 서버에 브라우저 인터페이스가 없습니다.
토론을 위해 URL이 생성되었습니다.
https://ourArchive.ourCompany.com/projects/ThisProject/repos/data/raw/foo/bar.spec?at=refs%2Fheads%2FTheBranchOfInterest
먼저 로그인해야했기 때문에 비트 버킷 저장소에서이 파일을 직접 다운로드 할 수 없습니다. 약간의 파기 후에, 나는 이것이 효과가 있음을 발견했다.
echo "myUser:myPass123"| base64
bXlVc2VyOm15UGFzczEyMwo=
curl -H 'Authorization: Basic bXlVc2VyOm15UGFzczEyMwo=' 'https://ourArchive.ourCompany.com/projects/ThisProject/repos/data/raw/foo/bar.spec?at=refs%2Fheads%2FTheBranchOfInterest' > bar.spec
이 조합을 통해 다른 모든 것을 빌드하는 데 필요한 하나의 파일을 다운로드 할 수있었습니다.
정식 체크 아웃 또는 유사한 로컬 작업을 수행하는 대신이 답변을 추가하고 있습니다. Git 제공자의 웹 인터페이스에 액세스 할 수 있다고 가정하면 주어진 커밋에서 파일을 직접 볼 수 있습니다. 예를 들어 GitHub에서 다음과 같은 것을 사용할 수 있습니다.
https://github.com/hubotio/hubot/blob/ed25584f/src/adapter.coffee
여기 ed25584f
은 관심있는 커밋의 SHA-1 해시에서 처음 8 자이며 소스 파일의 경로입니다.
마찬가지로 Bitbucket에서 다음을 시도 할 수 있습니다.
https://bitbucket.org/cofarrell/stash-browse-code-plugin/src/06befe08
이 경우 커밋 해시를 소스 URL 끝에 배치합니다.
파일을 다운로드하기 만하면 Git으로 체크 아웃 할 필요가 없습니다.
GitHub Mate 는 훨씬 쉽게 할 수 있습니다. Chrome 확장 프로그램이므로 파일 아이콘을 클릭하여 다운로드 할 수 있습니다. 또한 오픈 소스
git
! =github
파일의 로컬 버전을 편집하고 중앙 서버에서 유지 관리되는 원래 버전으로 되돌리려면 Git Extensions를 사용하여 쉽게 수행 할 수 있습니다 .
쉬운!