Git Clone : 파일 만주세요.


141

GIT 저장소를 복제하고 .git디렉토리로 끝나지 않습니다 . 즉, 나는 파일을 원한다. 이것을 할 수있는 방법이 있습니까?

git clone --no-checkout내가 원하는 것과 정확히 반대되었습니다 ( .git디렉토리 만주었습니다 ).

로컬 리포지토리가 아닌 원격 리포지토리 에서이 작업을 수행하려고합니다 . 이는 ""svn export "와 같은"git export "를 수행하는 방법 " 의 복제본아닙니다 . 같은).



@ Greg Hewgill 원격 저장소 에서이 작업을 수행하려고합니다. 그래도이 질문이 독창적인지 확실하지 않습니다.
Dan Rosenstark

1
이것은 새로운 질문이지만, 이것이 가치가 있다고 생각합니다. stackoverflow.com/questions/11497457/…
eonil

1
업데이트 답변보기 : git archive이제 정확합니다 (2017 년 4 분기). 빈 폴더는 포함되지 않습니다.
VonC

1
아니에요. 분명히, 귀하의 의견이 신고되었으며 삭제되었습니다 ... chat.stackoverflow.com/transcript/134259?m=39402889#39402889
VonC

답변:


75

찾고있는 것과 가장 가까운 git 명령은 git archive. git을 사용하는 프로젝트 백업
참조 : 모든 파일을 아카이브에 포함합니다 ( 스크립트를 사용하는 경우 하위 모듈 포함 )git-archive-all

그런 다음 어디에서나 해당 아카이브를 사용하여 .git디렉토리 없이 파일 만 다시 제공 할 수 있습니다 .

git archive --remote=<repository URL> | tar -t

첫 번째 수준의 폴더와 파일이 필요한 경우 :

git archive --remote=<repository URL> | tar -t --exclude="*/*"

원격 저장소의 첫 번째 레벨 폴더 만 나열하려면 다음을 수행하십시오.

git archive --remote=<repository URL> | tar -t --exclude="*/*" | grep "/"

참고 : GitHub에서는 작동하지 않습니다 (지원되지 않음)

따라서 복제 단계 (빠른 복제 단계를 위해 얕은)를 복제 한 다음 로컬로 아카이브해야합니다 .

git clone --depth=1 git@github.com:xxx/yyy.git
cd yyy
git archive --format=tar aTag -o aTag.tar

또 다른 옵션은 아래에 언급 된 것처럼 얕은 복제를 수행하지만 다른 위치에 .git 폴더를 찾는 것입니다.

git --git-dir=/path/to/another/folder.git clone --depth=1 /url/to/repo

repo 폴더에는 파일없이 파일 만 포함됩니다 .git.

참고 : git --git-dir 이 아닌 명령git 옵션입니다 git clone.


Git 2.14.X / 2.15로 업데이트 (2017 년 4 분기) : 빈 폴더를 추가하지 않도록 합니다.

" git archive", 특히 pathspec과 함께 사용될 때 Git 자체는 결코 그렇게하지 않더라도 출력에 빈 디렉토리를 저장했습니다.
이것은 수정되었습니다.

참조는 4,318,094 커밋 에 의해 (2017년 9월 12일) 르네 Scharfe를 (``) .
제안 : Jeff King ( peff) .
(의해 병합 - Junio C 하마노 gitster-62b1cb7 커밋 2,017 25 구월)

archive: 아카이브에 빈 디렉토리를 추가하지 마십시오

git은 빈 디렉토리를 추적하지 않지만 git archive일부는 아카이브에 넣도록 속일 수 있습니다.
그것이 객체 데이터베이스에 의해 지원되는 동안, 그것은 색인으로 표현 될 수 없으며 따라서 야생에서 일어날 가능성이 적습니다.

빈 디렉토리는 git에서 지원하지 않으므로 아카이브에도 쓰지 않아야합니다.
빈 디렉토리가 실제로 필요한 경우 빈 .gitignore파일을 저장 하여 추적하고 아카이브 할 수 있습니다 .


4
이것은 나를 위해 일했습니다. 한 가지 더 추가하겠습니다. .git 폴더를 전혀 신경 쓰지 않는다면 다음 명령을 사용합니다.git --git-dir=/dev/null clone --depth=1 /url/to/repo
HumanSky

이것은 .git 폴더를 제거하지 않습니다
aliasav

@VonC 내가 시도 : git --git-dir = / dev / null clone --depth = 1 / url / to / repo
aliasav

1
실행 git archive --remote=https://github.com/pornel/dssim.git @ | tar -t내가 얻을 tar: This does not look like a tar archive. GitHub에서 작동하지 않습니까? 또한 무엇을 @의미합니까?
André Werlang

2
@ AndréWerlang 7 년 후 ... 너무 확실하지 않습니다 @: 제거했습니다. 또한 GitHub는 리모컨을 지원하지 않습니다 git archive. 대안을 제안하기 위해 답변을 편집했습니다.
VonC

59
git archive --format=tar --remote=<repository URL> HEAD | tar xf -

여기 에서 가져온


2
--format=tar불필요합니다. "tar"는 기본 출력이므로 지정할 필요가 없습니다.
VasiliNovikov

1
배관으로 tar x충분
Jens Bannmann

42

얕은 복제본을 만들어 마지막 몇 가지 개정 만 가져올 수 있습니다.

 git clone --depth 1 git://url

그런 다음 단순히 .git 디렉토리를 삭제하거나 git archive트리를 내보내는 데 사용 하십시오.


o 복제를 반복하여 업데이트 할 때이 오류를 방지하는 방법 : "치명적 : 대상 경로 'XYZ'가 이미 존재하며 빈 디렉토리가 아닙니다."
Sohail Si

1
@SohailSi : 새 위치로 복제하거나 이전 디렉토리를 제거하십시오. 로컬 사본을 업데이트하려는 경우 새 개정판을 가져 오는 것이 좋습니다.
knittl

3

복제본을 수행 한 다음 .git디렉토리 를 삭제하여 작업 사본이 남아있는 이유는 무엇 입니까?

편집 : 또는 실제로 왜 클론을 전혀 사용합니까? .git디렉토리 없이 git repo를 원한다고 말하면 약간 혼란 스럽습니다 . 트리의 일부 상태의 사본을 원한다면 cp -Rgit clone 대신 쉘에서 수행하지 말고 .git나중에 삭제하십시오 .


고마워 파일은 자식 저장소에 있습니다. Mac 사용자가 GIT 저장소가 아닌 한 줄로 저장소 사본을 받도록 지시하고 싶었습니다.
Dan Rosenstark

사람들이 코드를 사용할 수없는 경우 (즉, Git 저장소가없는 경우) 리포지토리에서 직접 코드를 가져 오는 사람이 없어야합니다.
대안

@Amoss 사람들이 지속적으로 최신 코드를 얻지 않도록 tarball을 공개합니까?
대안

1
@mathepic : tarball을 해제하려면 저장소에서 깔끔하게 작업 사본을 얻는 방법이 필요합니다. 이는 정확히 제기 된 질문입니다.
앤드류

1
아래 답변을 읽고 약간의 인터넷 검색을 수행하면 stackoverflow.com/questions/160608 / ...라는 또 다른 질문이 생겼습니다 .git archive --remote의 사용법을 살펴보면 정확히 당신과 원래 포스터 ) 를 찾고 있습니다. 편집 : 이것은 Jon이 아래로 대답 한 것입니다.
Andrew

2

소스 코드의 사본을 원하는 것처럼 들립니다. 그렇다면 왜 디렉토리를 복사하고 사본에서 .git 디렉토리를 제외시키지 않습니까?


5
그것이 내가 묻는 것입니다 : git으로 그것을하는 방법 ... 나는 이미 받고있는 답변에서 그것을 할 수있는 방법이 없다고 이미 말할 수 있습니다. 어쨌든 고마워!
Dan Rosenstark

2

자식 체크 아웃 -f

작업 트리에서 저장소를 분리하여 다른 방법으로이를 수행 할 수 있습니다.

이 방법은 이러한 git-less git 파일을 정기적으로 업데이트해야하는 경우에 유용합니다. 예를 들어 소스 파일을 체크 아웃하고 아티팩트를 빌드 한 다음 서버에 배치하기 위해 아티팩트를 다른 저장소에 복사하고 소스 코드를 서버에 푸시 할 때도 사용합니다. 체크 아웃하고 www 디렉토리에 빌드 할 소스 코드.

작업 파일 용 git 용 폴더 하나를 만듭니다.

mkdir workingfiles
mkdir barerepo.git

베어 git 저장소를 초기화하십시오.

cd barerepo.git
git --bare init 

그런 다음 수신 후 후크를 작성하십시오.

touch hooks/post-receive
chmod ug+x hooks/post-receive

좋아하는 편집기에서 수신 후 편집 :

GIT_WORK_TREE=/path/to/workingfiles git checkout -f
# optional stuff:
cd down/to/some/directory
[do some stuff]

이것을 원격으로 추가하십시오 :

git remote add myserver ssh://user@host:/path/to/barerepo.git

이제 때마다 당신은에 작업 트리를 체크 아웃합니다이 베어의 repo에 밀어 /workingfiles/. 그러나 /workingfiles/그 자체는 버전 관리하에 있지 않습니다. 실행 git status에하는 /workingfiles/오류를 줄 것이다 fatal: Not a git repository (or any parent up to mount point /data). 그냥 평범한 파일입니다.

다른 솔루션과 달리 rm -r .git명령이 필요 /workingfiles/하지 않으므로 다른 git repo 인 경우 다른 repo의 git 파일을 제거하는 데 사용 된 명령에 대해 걱정할 필요가 없습니다.


1
동의했다. Bare Repo의 수신 후 후크가 가능합니다. +1
VonC

파일을 가져 오려는 경우 많은 작업
Rainb

파일을 정기적으로 원한다면 많은 작업이 아닙니다.
슬램
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.