2016-06-28 3 views
0

디렉터리에 영향을주는 커밋 만 가진 분기를 만드는 방법은 있습니까? 다음 (의, 확약 패치, 지점)과 같은 환매 특약 주어진 예를 들어디렉터리 아래에 만들어진 커밋에서 분기를 "추출"

:

g dir3/file33 (develop) 
f dir1/file12 
e dir2/file22 
d dir2/file21 
c dir1/file11 
b dir3/file32 (master) 
a dir3/file31 

보이는 지점 만들기 같은 : 지금까지 내가 생각했습니다

f' dir1/file12 (feature dir1) 
c dir1/file11 
b dir3/file32 (master) 
a dir3/file31 

이것은 내가 새로운 지점에서 필요한 커밋을 반환한다고 생각하지만, 그렇지 않습니다. 이 커밋들로 "추출"하는 방법을 알아라.

답변

1

지점에서 git 필터 분기를 수행하십시오. 자세한 내용은 https://git-scm.com/docs/git-filter-branch을 참조하십시오. --subdirectory-filter 플래그를보십시오. 나는 당신의 문제 진술을 다시 읽었을 뿐이며, 여러 디렉토리를 필터링하고 싶지는 않은 것 같습니다. 그렇다면 --subdirectory-filter는 하나의 디렉토리 만 지정할 수 있으므로 사용할 수 없습니다 (다른 디렉토리마다 --subdirectory-filter를 여러 번 지정할 수있는 것처럼 보이지 않습니다) .

또한 아마 패치가 필요에 더 적합 https://github.com/slobobaby/git_filter

+0

그는 'dir1'(주어진 예제에서 'master'로 시작하는 지점)을 원한다고 생각합니다. 따라서 하위 디렉토리 필터가 작동합니다. – bobDevil

0

봐.

는 다음 명령으로 패치를 만들 :

git diff origin/master HEAD -- <pathToDirectory>/ > changes.patch 

그런 다음 그러나 당신이 희망 공통 조상 인 커밋에서, 계획 지사를 확인하고 패치를 적용합니다. diffapplying 패치에 대한 공식 문서는 다음과 같습니다. 이렇게하면 충돌이 있으면 쉽게 해결할 수 있습니다.

0

git subtree split이 필요합니다.

Git의 일부 버전이 출시되었으므로 즉시 사용할 수 있습니다. 이전 버전에서는 Git 배포의 "contrib"디렉토리에있는 스크립트였습니다.

0

변경 사항에 대한 커밋을 선택하는 경우 rebase 또는 cherrypick이 필요합니다. 이를 위해, cherrypick이 가장 쉽다고 생각합니다.

git checkout -b feature/dir1 master 
git cherry-pick $(git rev-list --reverse master..develop -- dir1) 

, 그것은 c를 저지 단지 빨리 감기 당신의 이상은 할 수 있음을 통지하지 않습니다 그것을 할 수있는 쉬운 방법입니다하지만 그건 정말 문제가 무엇입니까? 그렇다면, 위의 master에 대해 c의 ID를 바꿔 넣으십시오.하지만 다른 디렉토리로 되돌아 가면 다시 실행 취소해야합니다.

관련 문제