2009-11-05 5 views
8

git에서 주어진 커밋 또는 일련의 커밋에서 변경된 파일 만 내보내거나 보관하는 간단한 방법이 있습니까? 나는 이것을하기위한 명확한 지시를 찾을 수없는 것 같다. (그리고 나는 Linux/Git에 처음이다.)Git에서 변경된 파일 만 내보내기/보관

저는 msysgit을 사용하고 있으며 대부분 전체 저장소를 배포하는 것이 좋습니다. 그러나 많은 경우 작은 파일을 한 번에 몇 개의 파일로 배포하는 것이 훨씬 효율적입니다.

원격 서버에서 git를 밀고 당기는 것은 실제로 프로젝트와 클라이언트간에 액세스 수준이 다르므로 실제로 옵션이 아닙니다.

(거친 추측)에 바로 전달 방법이 있나요 :

pipe 'diff --names-only' to 'git-archive'? 

답변

25

내가 자식 아카이브를 포함 할 필요가 있다고 생각하지 않습니다. --name-only를 사용하면 파일을 타르 수 :

tar czf new-files.tar.gz `git diff --name-only [diff options]` 

리눅스에 익숙하기 때문에,이 몇 가지 설명해야 할 수 있습니다

명령 줄에서 역 따옴표 먼저 내에서 명령을 실행하는 쉘의 원인을 백틱을 입력 한 다음 해당 명령의 출력을 tar의 명령 줄로 대체하십시오. 따라서 git diff이 실행되어 각 줄에 하나씩 파일 이름 목록이 생성됩니다. 줄 바꿈은 공백으로 축소되고 파일의 전체 목록은 tar 명령 줄에 배치됩니다. 그런 다음 tar이 실행되어 지정된 아카이브를 만듭니다. 이것은 상당히 긴 명령 행을 생성 할 수 있으므로 매우 많은 수의 변경된 파일이있는 경우 다른 기술이 필요할 수 있습니다.

+4

그냥 posterities를 위해서, 그 다른 기술은 다음과 같을 것이다 :'git diff --name-only [diff options] | xargs tar -czf files.tar.gz' – jason

+2

'xargs' 명령으로 하나의 명령 행에 모두 파일을 넣을 수있는 파일이 너무 많으면'xargs'가'tar'를 두 번 이상 실행하기 때문에 다른 문제가 있습니다. 이렇게하면'tar'가 새로운 .tar 파일을 작성하여 이전 파일을 덮어 쓰게되므로 마지막 배치 파일 만 포함하게됩니다. –

+0

구문을 설명해 주셔서 감사합니다! 백틱은 내가 필요한 것입니다 :) 이것은 파일명 (윈도우 ...)에 공백이있는 곳을 제외하고 msysgit과 함께 제공되는 bash 명령 줄에서 완벽하게 작동합니다. 자동으로 탈출 할 수있는 방법이 있습니까? – AKS