etc./StackOverFlow

특정 커밋에 대한 Git 패치를 생성하려면 어떻게 해야 합니까?

청렴결백한 만능 재주꾼 2022. 7. 6. 02:43
반응형

질문자 :elle


SHA-1 커밋 번호 목록에 대한 패치를 생성하는 스크립트를 작성해야 합니다.

git format-patch <the SHA1> 사용해 보았지만 SHA-1 값 이후 각 커밋에 대한 패치가 생성되었습니다. 수백 개의 패치가 생성된 후 프로세스를 종료해야 했습니다.

특정 SHA-1 값에 대해서만 패치를 생성하는 방법이 있습니까?



노력하다:

 git format-patch -1 <sha>

또는

 git format-patch -1 HEAD

위의 문서 링크에 따르면 -1 플래그는 Git에게 패치에 포함되어야 하는 커밋 수를 알려줍니다.

-<n>

최상위 커밋에서 패치를 준비합니다.


다음 명령을 사용하여 패치를 적용합니다.

 git am < file.patch

manojlds

특정 SHA-1 해시에서 최상위 <n> 커밋에서 패치를 생성하는 경우:

 git format-patch -<n> <SHA-1>

단일 패치 파일에 있는 헤드의 마지막 10개 패치:

 git format-patch -10 HEAD --stdout > 0001-last-10-commits.patch

Sriram Murali

커밋 1 후에 커밋 ID 2가 있다고 가정하면 다음을 실행할 수 있습니다.

 git diff 2 1 > mypatch.diff

여기서 2와 1은 SHA-1 해시입니다.


brandon

이 명령은 ( @ Naftuli Tzvi Kay 가 이미 제안한 대로),

 git format-patch -1 HEAD

HEAD 를 특정 해시 또는 범위로 바꿉니다.

Unix 메일박스 형식과 유사한 형식의 최신 커밋에 대한 패치 파일을 생성합니다.

-<n> - 최상위 <n> 커밋에서 패치를 준비합니다.

그런 다음 다음을 통해 패치 파일을 사서함 형식으로 다시 적용할 수 있습니다.

 git am -3k 001*.patch

참조: man git-format-patch .


Community Wiki

git format-patch commit_Id~1..commit_Id git apply patch-file-name

빠르고 간단한 솔루션.


zdrsoft

(단일 커밋) 패치가 특정 커밋 위에 적용되도록 하려면 새로운 git 2.9(2016년 6월) 옵션 git format-patch --base

 git format-patch --base=COMMIT_VALUE~ -M -C COMMIT_VALUE~..COMMIT_VALUE # or git format-patch --base=auto -M -C COMMIT_VALUE~..COMMIT_VALUE # or git config format.useAutoBase true git format-patch -M -C COMMIT_VALUE~..COMMIT_VALUE

커밋 bb52995 , 커밋 3de6651 , 커밋 fa2ab86 , 커밋 ded2c09 (2016년 4월 26일) by Xiaolong Ye(``) 를 참조 하세요.
(2016년 5월 23일 72ce3ff 커밋 에서 Junio C gitster -- gitster -- 병합)

format-patch : 기본 트리 정보를 기록하는 --base

유지 관리자 또는 타사 테스터는 패치 시리즈가 적용되는 정확한 기본 트리를 알고 싶어할 수 있습니다. git format-patch에 기본 트리 정보를 기록하고 첫 번째 메시지(커버 레터 또는 시리즈의 첫 번째 패치) 끝에 추가 --base

기본 트리 정보는 "기본 커밋"으로 구성되며, 이는 다른 모든 사람이 작업하는 프로젝트 기록의 안정적인 부분의 일부인 잘 알려진 커밋과 잘 알려진 0개 이상의 "필수 패치"로 구성됩니다. 패치를 적용하기 전에 토폴로지 순서로 "기본 커밋" 위에 적용해야 하는 "기본 커밋"의 일부가 아닌 실행 중인 패치입니다.

"기본 커밋"은 " base-commit: " 다음에 커밋 개체 이름의 40진수가 옵니다.
"prerequisite patch"는 " prerequisite-patch-id: " 다음에 40-hex "patch id"가 오는 것으로 표시되며, 이는 " git patch-id --stable " 명령을 통해 패치를 전달하여 얻을 수 있습니다.


Git 2.23(Q3 2019)에서는 " format-patch " --base " 옵션이 다음과 호환되는 방식으로 계산하도록 업데이트된 불안정한 방식으로 필수 패치에 대한 패치 patch-ids " git patch-id --stable ".

Stephen Boyd( akshayka )의 commit a8f6855 , commit 6f93d26 (2019년 4월 26일)을 참조하십시오.
(2019년 6월 13일 커밋 8202d12 에서 Junio C gitster -- gitster -- 병합)

format-patch --base patch-id 출력을 안정적으로 만듭니다.

diff.c patch-id 생성 코드에서 큰 덩어리를 처리할 때마다 컨텍스트를 플러시하지 patch-id ' 도구를 사용하여 "안정된" 패치 ID를 생성할 때 그렇게 했습니다.

유사한 논리를 patch-id.c 에서 diff.c로 diff.c format-patch --base= ' 유형의 명령 호출에 대한 패치 ID를 생성할 때 동일한 해시를 얻을 수 있도록 합시다.


힘내 2.24 (Q4 2019), 전에 " git format-patch -o <outdir> "의 상당했다 " mkdir <outdir> "없음 " mkdir -p <outdir> "수정되고있다.

Bert Wesarg( bertwesarg )의 commit edefc31 (2019년 10월 11일)을 참조하십시오.
(2019년 10월 18일 f1afbb0 커밋 에서 Junio C gitster -- gitster -- 병합)

format-patch : 출력 디렉토리의 주요 구성 요소 생성

사인오프: Bert Wesarg

"자식 포맷 패치는 -o '의 등가 않았다' mkdir <outdir> '하지' mkdir -p <outdir> '이 보정되고있다.

보안에 영향을 미칠 수 있는 선행 디렉토리에서 adjust_shared_perm '을 사용하지 마십시오. git init '와 같이 ' config.sharedRepository '를 일시적으로 비활성화하면 달성됩니다.


Git 2.25(2020년 1분기)에서는 format.useAutoBase 구성 변수가 설정되어 git rebase "가 제대로 작동하지 않아 수정되었습니다.

커밋 cae0bc0 , 커밋 945dc55 , 커밋 700e006 , 커밋 a749d01 , 커밋 0c47e06 (2019년 12월 4일) Denton Liu ( Denton-L ) .
(2019년 12월 16일 커밋 71a7de7 에서 Junio C gitster -- gitster -- 병합)

rebase : format.useAutoBase 파손 수정

보고자: Christian Biesinger
사인오프: Denton Liu

format.useAutoBase = true 로 rebase를 실행하면 오류가 발생했습니다.

 fatal: failed to get upstream, if you want to record base commit automatically, please use git branch --set-upstream-to to track a remote branch. Or you could specify base commit by --base=<base-commit-id> manually error: git encountered an error while preparing the patches to replay these revisions: ede2467cdedc63784887b587a61c36b7850ebfac..d8f581194799ae29bf5fa72a98cbae98a1198b12 As a result, git cannot rebase them.

format.useAutoBase 의 효과가 무효화 --no-base 를 rebase에서 format-patch로 전달하여 이 문제를 수정합니다.


Git 2.29(2020년 4분기)에서 " git format-patch " ( man ) 는 자동으로 계산된 기반이 의미가 없을 때 no-op이 되도록 format.useAutoBase 구성 변수에 대한 가능한 값으로 whenAble "을 취하는 방법을 배웁니다.

Jacob Keller( jacob-keller )의 commit 7efba5f (2020년 10월 1일)를 참조하십시오.
(2020년 10월 5일 커밋 5f8c70a 에서 Junio C gitster -- gitster -- 병합)

format-patch format.useAutoBase " whenAble " 옵션을 가르칩니다.

서명자: Jacob Keller

format.useAutoBase 구성 옵션은 사용자가 기본적으로 format-patch에 대해 --base=auto '를 활성화할 수 있도록 합니다.

이것은 고대 패치를 포맷하려고 할 때 예기치 않은 실패로 인해 때때로 불량한 워크플로로 이어질 수 있습니다.

 $ git format-patch -1 <an old commit> fatal: base commit shouldn't be in revision list

--base 요청했다는 것이 반드시 즉각적으로 명백하지 않기 때문에 매우 혼란스러울 수 있습니다(명령행이 아니라 구성에 있었기 때문에).

--base=auto 가 실패하기를 원합니다. 형식화된 패치가 요청될 때 기본 정보를 포함하지 않은 경우에도 마찬가지로 혼란스러울 것이기 때문입니다.

format.useAutoBase 에 새 모드인 " whenAble "을 가르칩니다.

이 모드는 format-patch가 가능한 경우 기본 커밋을 포함하도록 시도합니다. 그러나 유효한 기본 커밋을 찾을 수 없으면 format-patch는 기본 커밋 없이 패치를 계속 포맷합니다.

--base 와 함께 또 다른 브랜치 이름을 사용할 수 없도록 하려면 --base=whenAble 또는 --base=whenable .

대신 콜백을 사용 base_commit 옵션을 리팩터링하고 auto_base 에 의존합니다.

이것은 사용자가 명령줄에서 이 선택적 기본 커밋 생성을 요청할 수 없음을 의미합니다. 그러나 이것은 그다지 가치가 없습니다. 사용자가 기본 정보를 수동으로 요청하면 적절한 기본 커밋을 얻지 못했다는 사실을 즉시 알립니다. 이를 통해 사용자는 형식을 계속할지 여부에 대해 정보에 입각한 선택을 할 수 있습니다.

--base 대한 새로운 작동 모드를 다루는 테스트를 추가하십시오.

git config 이제 man 페이지에 다음을 포함합니다.

기본적 format-patch
--base=auto 활성화할 수 있도록 whenAble "로 설정할 수도 있지만 그렇지 않으면 형식이 죽지 않고 기본 정보 추가를 건너뛸 수 있습니다.


Git 2.30(2021년 1분기)에서는 " git format-patch --output=there " ( man ) 가 예상대로 작동하지 않고 대신 충돌했습니다.

이제 옵션이 지원됩니다.

commit dc1672d , commit 1e1693b , commit 4c6f781 (2020년 11월 4일) Jeff King( peff ) 을 참조하십시오 .
(2020년 11월 18일 5edc8bd 커밋 에서 Junio C gitster -- gitster -- 병합)

format-patch : 지원 --출력 옵션

보고자: Johannes Postler
서명자: Jeff King

우리는 format-patch에서 --output 옵션을 지원하려고 한 적이 없습니다. 그리고 baa4adc66a (parse-options: disable option abbreviation with PARSE_OPT_KEEP_UNKNOWN, 2019-01-27, Git v2.22.0-rc0)까지는 트리거가 불가능했습니다. setup_revisions() 에 넘기기 전에 먼저 format-patch 옵션을 구문 분석합니다.
커밋하기 전에 "--output-directory=foo"의 약어로 --output=foo 그러나 이후에는 약어를 확인하지 않고 --output이 diff 코드로 전달됩니다.

그 결과 넌센스 동작과 버그가 발생합니다. diff 코드는 rev.diffopt.file에서 파일 핸들을 열었지만 각 개별 패치 파일에 대해 여는 자체 핸들로 덮어씁니다. 따라서 --output 파일은 항상 비어 있습니다. 그러나 더 나쁜 것은 diff 코드가 rev.diffopt.close_file도 설정하므로 log_tree_commit() 이 파일 핸들 자체를 닫는다는 것입니다. cmd_format_patch() 의 메인 루프가 다시 닫으려고 시도하여 이중 자유가 발생합니다.

가장 간단한 해결책은 아무도 의도하지 않았기 때문에 format-patch로 --output을 허용하지 않는 것입니다. 그러나 실수로 문서화했습니다(format-patch에 diff-options가 포함되어 있기 때문에). 그리고 지정된 파일에 전체 출력을 기록하는 git log " ( man ) 와 함께 작동합니다. format-patch에서도 작동하도록 만드는 것은 쉽습니다. 실제로 --stdout과 동일하지만 특정 파일을 가리킵니다.

"close_file" 플래그에 의해 --output 옵션의 사용을 감지할 수 있습니다. 따라서 해당 플래그를 설정 해제하기만 하면 되지만 다른 작업은 수행할 필요가 없습니다. 그렇지 않으면 우리의 상황은 --stdout과 똑같습니다(파일을 fclose()하지 않지만 stdout의 경우도 마찬가지입니다. 프로그램을 종료하면 알아서 처리됩니다).


VonC

특정 커밋(마지막 커밋 아님)에서 패치를 생성하려면:

 git format-patch -M -C COMMIT_VALUE~1..COMMIT_VALUE

Makah

지정된 파일을 diff하려는 경우 다음을 사용할 수 있습니다.

git diff 마스터 766eceb -- 연결/ > 000-mysql-connector.patch


jiahut

Mercurial 배경으로 다음을 사용하려고했습니다.

 git log --patch -1 $ID > $file

git format-patch -1 $ID 사용을 고려하고 있습니다.


alls0rts

특정 SHA-1 값에 대해서만 패치를 생성하는 방법은 무엇입니까?

아주 간단합니다.

옵션 1. git show commitID > myFile.patch

옵션 2. git commitID~1..commitID > myFile.patch

참고: commitID 를 실제 커밋 ID(SHA-1 커밋 코드)로 바꿉니다.


Ankush

출처 : http:www.stackoverflow.com/questions/6658313/how-can-i-generate-a-git-patch-for-a-specific-commit

반응형