2010-08-06 2 views
21

힘내 나 특정의 복사본과 같이이 .zip 아카이브에 투입 할 수있는 매우 편리한 archive 명령을 가지고 범하다. 보통 나는 이전 버전부터 변경된 파일 만 필요합니다. 현재이 파일을 사용하여 파일을 zip 형식으로 가져옵니다.우편 번호 최신 커밋 만 변경

git diff --name-only previous-commit latest-commit | zip ../changes.zip [email protected]

위 작업은 커밋되지 않은 변경 사항이있는 작업 복사본의 파일을 압축합니다. zip에 직접 커밋 된대로 변경된 파일 만 얻을 수있는 방법이 있습니까?

답변

38

git archive은 인수로 경로를 허용합니다.

git archive -o ../latest.zip some-commit $(git diff --name-only earlier-commit some-commit) 

또는 당신이 그들에 공백 (또는 다른 특수 문자)를 가진 파일이있는 경우, xargs를 사용 : 당신이해야한다 모든이다

git diff --name-only earlier-commit some-commit | xargs -d'\n' git archive -o ../latest.zip some-commit 

제대로 설치 xargs를 할 수없는 경우를

#!/bin/bash 

IFS=$'\n' 
files=($(git diff --name-only earlier-commit some-commit)) 

git archive -o ../latest.zip some-commit "${files[@]}" 

쉘 스크립트로 작성되었지만 하나의 라이너로도 작동해야합니다. 또는 earlier-commit, some-commit../latest.zip$1$2$3으로 변경하면 재사용 가능한 스크립트를 갖게됩니다.

+0

좋은 사람! 그건 잘된거야. –

+5

그런 아카이브를 추출해도 파일이 삭제되지는 않습니다. 나중에 문제를 진단하기가 어려울 수 있습니다. – jilles

+0

@jilles : 매우 사실입니다. 이것이 패치가 훌륭한 이유입니다. @Marnix van Valen : 아마도 패치를 생성 한 다음 스크립트로 감쌀 수 있습니다 (하나의 파일에서 모든 것을 유지하기 위해 heredoc를 사용할 수도 있습니다). 그러면 사용 가능하고 잘 맞을 것입니다. – Cascabel

-1

왜 다른 코드베이스에 적용 할 수있는 자식 패치를 만들지 않으십니까?

$ git format-patch HEAD^..HEAD 
+1

모두가 패치 파일을 사용하는 방법을 알고있는 것은 아닙니다.고객에게 새 릴리스를 제공하기 위해이 방법을 사용합니다. 아카이브 압축을 풀면 개발자가 아닌 사람들도 할 수 있습니다. 패치를 적용하려면 모든 고객이 마스터하지 않은 기술이 필요합니다 (또는 마스터하기를 원할 수도 있습니다). –

4

패치를 만드는 것은 다음 옵션을 선택하지 않으면 어떻게 이런 일에 대해 :

git stash 
git checkout latest-commit 
git diff --name-only previous-commit | zip ../changes.zip [email protected] 
git checkout master 
git stash apply 

참고 : 커밋되지 않은 작업 복사본의 변경 사항이있는 경우 git stashgit stash apply 만 필요 .

주 2 : git checkout latest-commit는 분리 된 머리에 놓습니다. 완료되었을 때 git checkout master을 확인하거나 향후 커밋에 문제가 발생할 수 있습니다.

+0

나는 하나의 명령 솔루션을 원했고 ... –

+0

@Marnix van Valen 그럼 간단한 스크립트 (또는 배치 파일)로 바꾸지 않으시겠습니까? 문제는 파일 이름 목록을 특정 버전으로 변환해야한다는 것입니다. 내가 생각할 수있는 유일한 다른 방법은'git show latest-commit : file'을 사용하는 것입니다. 그러나, 나는 이것을하기 위해 하나의 라이너를 생각해 낼 수 없었다. 다음과 같이 보일 것입니다 :'git diff --name-only previous-commit | xargs -I file git show latest-commit : file' ...하지만 여기에 문제가 있습니다. 그러면 이름없이 파일을 STDOUT으로 인쇄합니다. 어떻게 이것을 zip 파일로 변환 할 수 있습니까? –

2

나를 위해 이러한 질문을 해결하는 데 유용한 것을 구현하기 위해 간단한 bash 스크립트를 구현했습니다. 이 스크립트는 개정 해시를 사용하고 디렉토리 계층을 포함하여 모든 변경된 파일과 함께 tar.gz 아카이브를 작성합니다. 누구나 그것을 사용하거나 수정할 수 있습니다. 도움이된다면 기쁠 것입니다.

git 저장소의 루트 디렉토리에서 스크립트를 실행하고 명령 행 argumens에 개정 해시를 전달하십시오.

Link to the script on hithub

+0

이 예제는 다음과 같이 보입니다 : #./do_delivery.sh -r a5ab48cdbb -n "vmeagt_delivery" ===> 아카이브 파일 이름 : "vmeagt_delivery-20120430" ===> 수정 된 버전 : "a5ab48cdbb -> HEAD" ===> 출력 경로 : "/ Users/crible/Projects/ServerView_Agents/" ===> 힘내 저장소 :"/ Users/crible/Projects/ServerView_Agents/" ===> tar.gz 아카이브 만들기 ... ===> 완료! –

+0

그것은 단지 개선되어야 할 첫 번째 버전입니다 :) –

1

나는 해결책, 하나 개의 라인과 매우 간단하여 COMME을 가지고

zip archive.zip $(git diff-tree --no-commit-id --name-only -r latest-commit) 

당신은뿐만 아니라이 방법으로 타르와 같은 다른 보관 방법을 사용할 수 있습니다.