2013-10-11 3 views
1

저는 git-p4를 사용하여 Perforce repo의 일부를 git repo로 복제했습니다.동일한 repo에서 하나의 서브 트리에서 다른 서브 트리로 커밋 적용

의 repo/releaseA
의 repo/releaseB
의 repo는/featureA
의 repo는/featureB

내가 가진 자식의 무리에 커밋 : 나는 체크 아웃 한 나무는 다음과 억지로 "지점"구조를 가지고 featureA 디렉토리에 대한 내 로컬 자식 repo; 그러나 나는 커밋을 featureB 디렉토리에 "rebase"하고 싶습니다. 원래 한 디렉토리에 적용된 패치/커밋 세트를 다른 디렉토리로 변환하는 방법이 있습니까?

답변

3

예. 커밋이 에 영향을 미칠 경우에만repo/featureA이 매우 간단 수 있습니다 :

mkdir patches 
git format-patch -o patches master..my_featureA_branch 

git am patches/* -p3 --directory=repo/featureB 

하면됩니다. 커밋이 REPO 외부 파일을 변경하는 경우

은/featureA 당신은 git am 전에, 사람들을 제거하기 위해

sed -s -i -r -f mystuff.sed patches/* 

cat >mystuff.sed <<\EOD 
/^(From [0-9a-f]{40}|diff --git)/!{H;$!d} 
x 
/^From /b 
${h;s,.*--,--,;x} 
\,^diff[^\n]* [ab]/repo/featureA/,!{$!d;x;b} 
${p;x} 
EOD 

이 필요합니다. 그 외의 경우에는 repo/featureA에 영향을주지 않는 패치가 있으면 git am --skip이됩니다.

+0

첫번째 케이스는 내가 필요한 것입니다. 그러나 필자는 "-p2"를 사용하여 "repo"디렉토리가 실제로 루트가 되었기 때문에 작동하게해야했습니다. – animus144

+0

> 5 분 편집 : "repo"디렉토리가 repo 루트이기 때문에 "-p2"및 "--directory = featureB"를 사용했습니다. – animus144

0
  • 당신이 하나의 단일 한 후 사용 커밋 선택하려는 경우,

    git cherry-pick <commit-id>

  • 당신의 시리즈를 적용하려면 다음 사용 C1에서 Cx로 시작하는 커밋 rebase --onto

    git rebase --onto featureB C1 Cx

+0

질문자는 동일한 * git 저장소 내에서 하나의 디렉토리에서 다른 디렉토리로 커밋하는 방법을 알고 싶어합니다. 그럼 당신의 대답은 어떻게 도움이 될까요? – villekulla

+0

'feature.A 디렉토리에있는 로컬 git repo에 여러 개의 git 커밋이 있습니다'는 OP에 하나 이상의 repos가 있음을 의미합니다! –

+0

나를 위해 그는 단지 하나의 자식 repo을 가지고 소리. 나는 – villekulla

관련 문제