git으로 특정 디렉토리를 가져 오는 방법


193

git이있는 프로젝트가 있고 subversion과 마찬가지로 myproject / javascript와 같은 특정 디렉토리를 복제하거나 가져 오려고합니다.
변경하고 커밋 한 후 다시 푸시하십시오.
있을 수있다?


3
스파 스 체크 아웃은 관심을 가질 수 있습니다 (여전히 모든 것을 가져와야하지만) : stackoverflow.com/questions/2416815/…
VonC

답변:


205
  1. 당신의 repo 사본의 상단에 cd
  2. git fetch
  3. git checkout HEAD path/to/your/dir/or/file

    • " path/...(3)의 " "은 (는)" .../file"을 포함하는 저장소 루트 바로 아래의 디렉토리에서 시작합니다.

    • "HEAD"대신 특정 커밋의 해시 코드가 사용될 수 있으며, 해당 커밋에 특정한 개정 (파일) 또는 개정 (dir)을 얻게됩니다.


1
내가 그 질문을 오해했다는 것을 깨달았습니다. 답장 대신 단일 파일을 체크 아웃하는 방법을 설명하고 수정하여 커밋 할 수 있습니다.
vergueishon

당신은 질문의 제목을 다루었습니다. 이것은 내가 나를 아끼지 않는 한 저를 구했습니다. 특히 이것이 정답입니다. 특히 이것은이 문제에 대한 Google의 최고 인기이기 때문입니다.
Morgon

21
그래도 여전히 전체 저장소를 얻습니다. 크기가 2GB 인 프로젝트의 경우 시간이 많이 절약되지 않습니다.
Pithikos

5
이 의견을 읽고 이것이 어떻게 질문에 대답하지 못하는지를 알고있는 사람들에게는이 솔루션이하는 일은 하나의 폴더 만 사본을 제공하지만 실제 사본이 아니므로 수정하거나 다시 사용할 수 없습니다 -범하다. @Morgon이 말했듯이, 그것은 질문의 제목을 다루지 만 (당신은 하나의 디렉토리 만 가져올 수 있습니다), 질문의 본문에 대답하지 않습니다 ( "일부 변경하고 커밋하고 다시 밀어 넣습니다").
msb

@StanHolodnak --는 필요하지 않습니다. 이후 비트를 경로로 해석하도록합니다. 예, --help체크 아웃하려는 이름의 파일이있는 경우 다음 하이픈으로 접두사를 git checkout HEAD -- --help
붙여야

105

빈 디렉토리에서 :

git init
git remote add [REMOTE_NAME] [GIT_URL]
git fetch REMOTE_NAME
git checkout REMOTE_NAME/BRANCH -- path/to/directory

로컬 파일을 대체하기 위해 파일의 원격 버전 만 사용하려는 경우 작동합니다.
John

이것은 또한 폴더를 당겨, 폴더를 donwload하지 않고 폴더 안에있는 것들 만 어떻게합니까?
Al Kasih

필요 fetch하거나 checkout명령이 필요하지 않으므로 명령 후 풀 요청을 remote add수행하여 전체 마스터 브랜치를 얻을 수 있습니다.
이크 라.

2
허용 된 답변에서 Pithkos가 지적한대로이 답변은 WHOLE 원격 리포지토리를 로컬 컴퓨터로 다운로드합니다. shingara의 답변이 가장 명확합니다. 리포지토리의 일부를 원격으로 가져올 수있는 방법이 없습니다. 그러나 WHOLE 페치의 대역폭을 신경 쓰지 않고 로컬 캐시의 일부에 대한 작업 사본을 만드는 데 관심이있는 사람들에게는 허용되는 답변이 방법을 보여줍니다. 그러나 레포의 전체 기록 (압축 형식)을 컴퓨터에 다운로드해야한다는 것을 분명히하고 싶습니다.
Gabe Halsmer

39

찾기, 포기, 다시 시도하지 않는 대답을 많이 찾은 후에 마침내 다른 SO 스레드에서 이에 대한 해결책을 찾았습니다.

하나의 폴더를 제외한 모든 폴더를 git-pull하는 방법

존재하는 내용을 복사하여 붙여 넣기 :

git init
git remote add -f origin <url>
git config core.sparsecheckout true
echo <dir1>/ >> .git/info/sparse-checkout
echo <dir2>/ >> .git/info/sparse-checkout
echo <dir3>/ >> .git/info/sparse-checkout
git pull origin master

OP가 원하는 것을 수행하려면 (하나의 디렉토리에서만 작동) .git/info/sparse-checkout위의 단계를 수행 할 때 하나의 디렉토리를 추가 하십시오.

@cforbish 덕분에 많은 감사합니다!


2
나는 그것을 어떻게 구글에하려고 할 때마다 가장 좋은 결과이며 스레드가 표시되지 않기 때문에 주로 여기에 게시하고 있습니다. :( 나는 나쁜 복사 붙여 넣기를 느낀다. 그러나 그것이 최선의 방법이라고 생각합니까?
msb

1
이것이 유일한 유일한 해결책입니다. 위의 답변을 시도했습니다. 다른 답변으로 내 지점을 체크 아웃 한 후에는 뽑을 수 없었고 커밋해야 할 몇 가지 새로운 파일이있었습니다. 이 솔루션을 사용하면 모든 것이 올바르게 보입니다. 그러나 참고 : 체크 아웃 한 브랜치에 관계없이 git은 당신이 있다고 생각합니다 master. 그냥 당신이 있는지 확인 git branch --set-upstream-to=origin/<branch>제대로 당겨
seebiscuit

12

불가능합니다. 모든 저장소를 가져 오거나 아무것도 필요하지 않습니다.


1
모든 것을 가져와야 하지만 이 경우 스파 스 체크 아웃 작업 트리 를 가져 오는 것이 중요합니까? 참조 stackoverflow.com/questions/2416815/...
VonC

10
이것을 추가하기 만하면 디렉토리 만 가져올 수없는 이유는 git이 파일 의미 추적이 아닌 데이터 의미 추적을 사용하기 때문에 소스를 알리지 않고도 파일 안팎으로 코드 (또는 다른 데이터)를 원활하게 이동할 수 있기 때문입니다 추적 시스템 (물론 업데이트 할 때까지) 이로 인해 코드가 디렉토리 내외부로도 원활하게 이동할 수 있으므로 하나의 디렉토리 만 잡는 것은 그리 의미가 없습니다. 도움이 되었기를 바랍니다.
OmnipotentEntity

12
@OmnipotentEntity 죄송하지만 IMHO 말이됩니다. 구현이 사용을 제한해서는 안됩니다. Git은 (최소한 로컬 작업 복사본을 만들 때) 디렉토리가 무엇인지 알기 때문에 서버에서 비슷한 작업을 수행하지 못하고 관련 출력을 보낼 이유가 없습니다. 물론, 그것은 현재 구현되지 않았지만 그것은 근본적인 불가능이 아닌 기능의 부족 때문입니다. 개인적으로 나는 그것이 매우 중요한 기능이라고 생각하지만, 가능하다면 git을 피하는 한 가지 이유입니다.
기본

10

이 명령이 도움이 될 수 있습니다.

git archive --remote=MyRemoteGitRepo --format=tar BranchName_or_commit  path/to/your/dir/or/file > files.tar

"이봐 요"


2
아카이브 목적으로 파일의 특정 디렉토리를 다운로드합니다. 이것은 수정하고 되돌릴 수있는 사본을 가져 오지 않습니다.
leetNightshade

매우 시원합니다. 아마도 OP에 대한 솔루션으로 받아 들일 수는 없지만 실제로 는 더 큰 저장소에서 큰 폴더의 내용을 검색해야하기 때문에 필자가 원하지 않기 때문에 실제로 필자 가 따르지 않았으며 수정하지 않아도됩니다. 푸시.
올리버

7

디렉토리를 입력하지 않고 최신 변경 사항을 얻으려면 다음을 수행하십시오.

$ git -C <Path to directory> pull


1

이 작업을 시도하고 테스트했습니다!

mkdir <directory name> ;  //Same directory name as the one you want to pull
cd <directory name>;
git remote add origin <GIT_URL>;
git checkout -b '<branch name>';
git config core.sparsecheckout true;
echo <directory name>/ >> .git/info/sparse-checkout;
git pull origin <pull branch name>

이것이 도움이 되었기를 바랍니다!


0

때때로, 당신은 diff를 거치지 않는 사전이없는 파일의 이전 사본을보고 싶을뿐입니다.

이 경우 리포지토리의 복제본을 만들고 관심있는 특정 커밋을 체크 아웃하고 해당 리포지토리의 하위 디렉토리를 살펴 보는 것만 큼 쉽습니다. 모든 것이 로컬이기 때문에 완료되면이 복제본을 삭제할 수 있습니다.


-1

이론적 인 파일 경로와 예제와의 어려움을 겪고있는 실제 사례는 다음과 같습니다 .Microsoft는 git hub에서 문서와 예제를 제공하지만 불행히도이 저장소의 많은 주제에 대한 모든 예제 파일을 수집합니다.

https://github.com/microsoftarchive/msdn-code-gallery-community-s-z

나는 경로의 Microsoft Dynamics js 파일에만 관심이있었습니다.

msdn-code-gallery-community-s-z/Sdk.Soap.js/

그래서 나는 다음을했다

만들

msdn-code-gallery-community-s-zSdkSoapjs\.git\info\sparse-checkout

디스크의 리포지토리 폴더에있는 파일

git sparse-checkout init

Windows에서 cmd를 사용하여 해당 디렉토리에

파일 내용

msdn-code-gallery-community-s-zSdkSoapjs\.git\info\sparse-checkout

이다

Sdk.Soap.js/*

마침내

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