Git을 설치하지 않고`git diff` 패치를 적용하는 방법은 무엇입니까?


280

클라이언트가 git diffgit을 설치하지 않고 만든 패치를 어떻게 적용 할 수 있습니까? patch명령 을 사용하려고 했지만 항상 파일 이름을 패치하도록 요청합니다.


4
패치에 이름 변경이 포함 된 경우이 작업을 수행하는 방법을 아는 사람이 있습니까? 패치가 현재이를 기본적으로 지원합니까?
Paul Crowley

3
질문은 정말로 있어야합니다 : git을 설치하지 않고 git diff를 적용하는 방법 이 있습니까? 아래언급 된대로이patch 형식을 완전히 지원하지는 않습니다.
Aryeh Leib Taurog

답변:


425
git diff > patchfile

patch -p1 < patchfile

많은 사람들이 의견과 다른 답변 패치에서 알 수 있듯이 추가, 삭제 및 이름 바꾸기를 이해하지 못합니다. 옵션이 없지만 git apply patchfile핸들 파일 추가, 삭제 및 이름 변경이 필요한 경우.


2015 년 12 월 수정

최신 버전의 patch명령 (2012 년 9 월에 릴리스 된 2.7) 은 이름 변경 및 복사, 권한 변경 및 symlink diff (이진 diff는 아님) ( 릴리스 발표 )를 포함하여 "diff --git"형식의 대부분의 기능을 지원 합니다.

따라서 현재 / 최신 버전 patch을 사용 git하는 경우 diff를 패치로 적용 할 필요가 없습니다 .


97
또는을 사용 git diff > patchfile하되patch -p1 < patchfile
Jakub Narębski

11
저장소의 서브 패스에 대한 패치 파일을 작성하려면 다음 relative과 같은 옵션을 사용할 수 있습니다 .git diff --no-prefix --relative=my/relative/path > patchfile
Koen.

2
patch -p1 < patchfile자식 설치가 필요하지 않습니다. 첫 번째 명령은 diff를 적용하지 않고 생성하는 명령을 보여줍니다.
Andrey Kuznetsov

1
생성 된 패치는 변경이다 로부터 명령에 표시된 지점 / refspec 현재 또는 활성 지점. 즉, 당신이 원하는 git diff from_branch > patchfile; git checkout from_branch; git patch -p1 < patchfile또는git diff from_branch to_branch > patchfile; ...
호브

1
@PaulChechetin egor83은 suppie의 답변에서 처음에 슬래시를 제거합니다.
Andrey Kuznetsov

75

이 시도:

patch -p1 < patchfile

4
-p1 인수는 무엇을합니까?
chrisjlee

8
스트립은 처음에 슬래시입니다.
egor83

16
@chrisjlee는 git diff넣어 것입니다 a/b/그래서, 출력에 접두사 patch -p1패치 파일을 적용하는 사람들을 무시한다.
wberry

49

사용하다

git apply patchfile

가능하다면.

patch -p1 < patchfile 

잠재적 부작용이 있습니다.

git apply또한 파일 추가, 삭제 및 이름이 git diff형식으로 설명되어 있으면 이름 바꾸기를 처리합니다 patch. 마지막으로 git apply패치가 패치 파일을 부분적으로 적용하여 작업 디렉토리를 이상한 상태로 남겨 둘 수있는 반면, 모든 것이 적용되거나 전혀 적용되지 않는 "모두 적용 또는 모두 중단"모델입니다.


1
+1, 유일한 정답입니다. 또한 diff / patch는 심볼릭 링크를 처리하지 않습니다. 예를 들어 3.10 Linux 커널 패치를 되돌릴 경우 문제가됩니다.
ignis

10
예, git apply최선의 방법이지만,이 질문은 Git을 설치하지 않고 패치를 적용하는 방법을 구체적으로 묻습니다 .
콜린 D 베넷

1
옵션 --dry-run --verbose은 부작용이있는 경우 결정하는 데 유용합니다. (패치 v2.5.8 사용)
spyle

@ignis- " git apply patchfile -... 유일한 제정신의 대답 ..." -거의 웃기다 OpenSSL 개발자가 테스트를 위해 패치를 보낼 때마다 Git은이를 적용하지 않습니다. 그 때마다 입니다. 나는 그 멍청한 도구가 패치를 적용하는 것을 아직 보지 못했습니다.
jww

8

나는 사용한다

patch -p1 --merge < patchfile

이런 식으로, 갈등은 평소와 같이 해결 될 수 있습니다.


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