2017-10-18 19 views
0

두 로컬 다른 git repos가 있는데, ab입니다. 둘 다 내 홈 디렉토리의 projects 폴더에 있습니다. 두 repos에서 특정 파일간에 diff를 얻고 싶습니다. foo으로 전화를 걸어 diff를 a에 적용 해 봅시다. 내가 a 내부에서 git diff ./foo ../b/foo > diff.diff을 실행하면두 개의 서로 다른 git repos에있는 파일을 서로 비교하고 첫 번째 repo에 적용하십시오.

나는 DIFF을보고 그것이 내가 적용 할 변경 사항이 포함되어 있는지 확인하지만 그때 git apply diff.diff를 실행할 때이 오류가 얻을 수 있습니다 :

fatal: invalid path './foo' 

내가 시도하는 경우를 난은 diff를 적용하려고하면 git diff ~/projects/a/foo ~/projects/b/foo > diff.diff 실행, 나는이 오류 얻을 : 이제

error: home/ryan/projects/a/foo: No such file or directory 

을, 난 그냥은 diff를 적용하는 것과 같은 효과를 얻을 수있는 파일을 복사 할 수 있지만, 좋은 이유는 왜 ISN이 일하는거야?

+0

단일 저장소 내에서만 diff를 사용할 수 있습니다. 하지만 평범한'diff' 만 실행하면됩니다. 'diff'의 결과를'git apply'와 함께 사용하려면 unidiff 형식을 위해'diff -u'를 사용하십시오. – Mort

+0

난 그냥 상대 경로를 사용하여 그것을 시도하고 diff 성공적으로 생산했지만 비슷한'No such file or directory' 오류가 발생했습니다. – Ryan1729

답변

1

의 repo a와의 repo b 사이 foo 파일을 비교하고 a을 REPO에 변경 사항을 적용하려면, 당신은 단지 명령 아래 사용해야 :

# In ~/projects/a (local repo a) 
git remote add repob ~/projects/b -f 
git diff master repob/master -- foo > diff.patch 
git apply diff.patch 
이제

의 repo에서 foo의 repo b의 버전 a 변화를 . 그런 다음 커밋 밀어 수 있습니다 모든

git add foo 
git commit -m 'change foo as the version in repo b' 
git push 
+0

어쩌면 나는 뭔가를 놓치고있다. 그러나 그것은 단지 diff를 만들고 rep 파일 자체를 커밋하는 것처럼 보일 것이다. 실제로 diff가 적용됩니까? – Ryan1729

+0

좋아, 대답을 업데이트했다. 그런 다음 실제로 repo'b'에서'foo'를 repo'a '에 적용합니다. –

+0

리모컨 추가가 필요하지만 리모콘을 추가하면 효과가 있습니다. 이것은 diff를'a' 디렉토리에 남겨두기 때문에 대신'/ tmp/diff.patch'를 사용하고자 할 수 있습니다. – Ryan1729

0

첫째, git diff 당신에게 아무것도 구입하지 여기에 - 당신은뿐만 아니라 diff -u 일반을 사용할 수 있습니다. 패치가 적용되지 않는 이유는 git-apply이 diff의 일관성없는 파일 경로로 혼동되기 때문입니다. 이 문제를 해결하려면 diff에서 파일의 두 버전에 대해 동일한 깊이의 상대적 경로가 있도록 작업 디렉토리를 설정해야합니다. 여기에서 두 프로젝트 디렉토리의 공통 상위 디렉토리로 변경합니다.

cd ~/projects 
diff -u a/foo b/foo >a/diff.patch 
cd a 
patch -p1 <diff.patch 
git add ... commit ... etc ...