한 저장소에서 다른 저장소로 GIT 패치를 적용하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/931882

문제

두 개의 리포지토리가 있습니다. 하나는 라이브러리의 주요 리포지어이고 다른 하나는 해당 라이브러리를 사용하는 프로젝트입니다.

서브 서비스 프로젝트를 고치면 패치를 상류로 다시 적용 할 수있는 쉬운 방법을 원합니다.

파일의 위치는 각 저장소에서 다릅니다.

  • 메인 repo : www.playdar.org/static/playdar.js
  • 프로젝트: playlick.com/lib/playdar.js

나는 사용을 시도했다 git format-patch -- lib/playdar.js Playlick 프로젝트에서 git am 기본 Playdar Repo에서 패치 파일의 다른 파일 위치는 오류가 발생했습니다.

주어진 파일의 주어진 커밋에서 패치를 다른 곳의 다른 임의 파일에 쉽게 적용 할 수있는 방법이 있습니까?

보너스 포인트의 경우 패치를 적용하려는 파일이 git 저장소에 있지 않으면 어떻게됩니까?

도움이 되었습니까?

해결책

패치 파일을 수동으로 편집하는 것이 질문이 없거나 Infeasible이면 표준 옵션으로 수행 할 수 있습니다 (사용 가능 git apply, git format-patch 그리고 GNU patch).

  1. -p<n> 제거합니다 n 패치의 경로에서 주요 디렉토리.

  2. 처리 후 -p, --directory=<root> Prepends root 적용하기 전에 패치의 각 경로에.

예시

따라서, 당신의 예를 위해, 원래는 패치를 가져 가려고 static/playdar.js 그리고 그것을 적용하십시오 lib/playdar.js, 당신은 실행합니다 :

$ cat patch_file | git am     \ 
          -p1                 \ # remove 1 leading directory ('static/')
         --directory='lib/'     # prepend 'lib/'

다른 팁

제작 된 패치 git format-patch 단순히 텍스트 파일입니다. Diff 헤더를 편집하여 다른 경로를 수정할 수 있습니다.

예를 들어, 그것은 다음과 같은 것을 생산했을 것입니다.

diff --git a/lib/playdar.js b/lib/playdar.js
index 1234567..89abcde
-- a/lib/playdar.js
++ b/lib/playdar.js

당신이해야 할 일은 변화뿐입니다 lib/playdar.js 에게 static/playdar.js 그런 다음 패치를 실행하십시오 git am"

패치는없는 사람들을위한 표준 GNU 패치 유틸리티에 의해 읽을 수 있어야합니다. git---하지만 달리지 마십시오 format-patch 이랑 -M, -C 이 경우에 대한 지원이 보편적이지 않기 때문에 이름 바꾸기 패치를 생성하는 옵션.

두 프로젝트가 모두 GIT 프로젝트라고 가정하면 하위 모듈 당신에게 완벽하게 맞을 것입니다. 이를 통해 GIT 프로젝트는 다른 GIT 프로젝트에 동적으로 연결되어 있으며, 본질적으로 다른 Git Repo 내부에서 Git Repo를 베이킹하는데, 둘 다 고유 한 삶을 살고 있습니다.

다시 말해, "Project"의 하위 모듈로 "Main Repo"를 추가하십시오. "메인 repo"에서 새로운 물건을 커밋/밀어 넣을 때마다 git pull 다시 "프로젝트"로 돌아갑니다.

완료합니다 헨릭의 대답, 그리고 보너스 포인트를 찾기 위해

패치를 적용하려는 파일이 git 저장소에 있지 않다면 어떻게해야합니까?

Git 저장소에서 나오는 패치에 대한 파일 후보의 디렉토리에 액세스 할 수있는 경우 먼저 해당 트리의 디렉토리/파일 트리를 GIT 저장소 자체로 변환 할 수 있습니다! ( ''git init': git 리포지토리는 결국 루트 디렉토리 내에서 단지.
그런 다음 해당 repo를 메인 프로젝트의 하위 모듈로 설정합니다.

새 리모컨을 추가하고 가져올 수 있습니다. 세부 사항이있는 기사.

$ cd <path-to-repoB>
$ git remote add repoA <git-URL-for-repoA>
$ git pull repoA

하위 트리가 문제에 가장 적합한 솔루션이라고 생각합니다.

튜토리얼 1

Tuorial 2

메인 리포지토리를 임시로 제거 할 수 있습니다.

cd to/main/project
mv .git .git_
cd to/sub/project
git apply patchname
cd -
mv .git_ .git

사용 --relative 옵션 format-patch 추상화를 향상시킬 수 있습니다 (패치가 생성 된 저장소에 대한 관련없는 세부 사항 숨기기).

[repository-with-changes]
git format-patch --relative=(path-to-library) (base-commit-for-patch) ## 'HEAD~1'

나는 그것을 발견했다 --3way 패치를 적용 할 때 필요한 옵션 (피하기 위해 does not exist in index 오류) - 마일리지는 다를 수 있습니다. 사용 --directory=(...) 대상 경로가 저장소의 루트가 아닌 경우에만 필요할 수 있습니다.

[repository-to-update]
git am --3way --directory=(path-to-library) (patch-file)

  • format-patch 'base'이후 현재 지점에 커밋 당 하나의 패치 파일을 생성합니다.

  • 에 대한 문서 --relative 옵션이있는 것 같습니다 어떤 경우에는 누락됩니다, 그러나 어쨌든 (버전 2.7.4) 작동하는 것으로 보입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top