GIT 저장소를 복제하고 .git디렉토리로 끝나지 않습니다 . 즉, 나는 파일을 원한다. 이것을 할 수있는 방법이 있습니까?
git clone --no-checkout내가 원하는 것과 정확히 반대되었습니다 ( .git디렉토리 만주었습니다 ).
로컬 리포지토리가 아닌 원격 리포지토리 에서이 작업을 수행하려고합니다 . 이는 ""svn export "와 같은"git export "를 수행하는 방법 " 의 복제본 이 아닙니다 . 같은).
GIT 저장소를 복제하고 .git디렉토리로 끝나지 않습니다 . 즉, 나는 파일을 원한다. 이것을 할 수있는 방법이 있습니까?
git clone --no-checkout내가 원하는 것과 정확히 반대되었습니다 ( .git디렉토리 만주었습니다 ).
로컬 리포지토리가 아닌 원격 리포지토리 에서이 작업을 수행하려고합니다 . 이는 ""svn export "와 같은"git export "를 수행하는 방법 " 의 복제본 이 아닙니다 . 같은).
답변:
찾고있는 것과 가장 가까운 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파일을 저장 하여 추적하고 아카이브 할 수 있습니다 .
git --git-dir=/dev/null clone --depth=1 /url/to/repo
git archive --remote=https://github.com/pornel/dssim.git @ | tar -t내가 얻을 tar: This does not look like a tar archive. GitHub에서 작동하지 않습니까? 또한 무엇을 @의미합니까?
@: 제거했습니다. 또한 GitHub는 리모컨을 지원하지 않습니다 git archive. 대안을 제안하기 위해 답변을 편집했습니다.
git archive --format=tar --remote=<repository URL> HEAD | tar xf -
여기 에서 가져온
--format=tar불필요합니다. "tar"는 기본 출력이므로 지정할 필요가 없습니다.
tar x충분
얕은 복제본을 만들어 마지막 몇 가지 개정 만 가져올 수 있습니다.
git clone --depth 1 git://url
그런 다음 단순히 .git 디렉토리를 삭제하거나 git archive트리를 내보내는 데 사용 하십시오.
복제본을 수행 한 다음 .git디렉토리 를 삭제하여 작업 사본이 남아있는 이유는 무엇 입니까?
편집 : 또는 실제로 왜 클론을 전혀 사용합니까? .git디렉토리 없이 git repo를 원한다고 말하면 약간 혼란 스럽습니다 . 트리의 일부 상태의 사본을 원한다면 cp -Rgit clone 대신 쉘에서 수행하지 말고 .git나중에 삭제하십시오 .
소스 코드의 사본을 원하는 것처럼 들립니다. 그렇다면 왜 디렉토리를 복사하고 사본에서 .git 디렉토리를 제외시키지 않습니까?
작업 트리에서 저장소를 분리하여 다른 방법으로이를 수행 할 수 있습니다.
이 방법은 이러한 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 파일을 제거하는 데 사용 된 명령에 대해 걱정할 필요가 없습니다.