2012-04-04 2 views
2

내 'trunk'브랜치의 최신 버전에 수명이 긴 브랜치 ('메트릭')를 리베이스하는 것이 문제가 있습니다. 목표는 내 변경 사항을 리베이스 한 다음 SVN에 다시 커밋하는 것입니다.이동 된 파일로 git-svn rebase를 해결하는 방법은 무엇입니까?

rebase에는 현재 75 단계가 있고 40 단계는 svn에서 재배치 된 파일에 중요한 소스 코드 변경 사항을 적용하고 있습니다.

특히, 나는 /java/**/*.java에서 파일을 많이 변경했다. 한편, 이들 파일은 /src/main/java/**/*.java로 재배치되었습니다.

자식의 상태를 보여줍니다이 상태에서 900 개 파일에 걸쳐 있습니다

# Not currently on any branch. 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# 
# Unmerged paths: 
# (use "git reset HEAD <file>..." to unstage) 
# (use "git add/rm <file>..." as appropriate to mark resolution) 
# 
# added by them:  java/StripesResources.properties 
.... (many files like this) 
# both deleted:  src/StripesResources.properties 
.... (many files like this) 
# added by us:  src/main/java/StripesResources.properties 
.... (many files like this) 

, 내가 그들을 병합하기 위해 무엇을 할 수 있습니까? 그들 모두가 상당한 변화를 겪지는 않습니다.

나는 '우리'위치 (그들이 있어야하는 곳)에 파일의 '그들'버전을 복사/복사하려고 시도했지만 작동하지 않는 것 같습니다.

이 경우 'git mv'를 사용해야합니까?

감사합니다.

+0

이것은 어려운 문제로 들립니다. 브랜치를 병합하기 전에, (복사본)의 히스토리를 변경해야만 파일이 트렁크의 새로운 위치로 옮겨져 업데이트가 적용됩니다. – antlersoft

+0

파일은 이미 올바른 위치에 있습니다. 트렁크에서 내 '메트릭'스트림으로 이러한 변경 사항을 병합 (리베이스되지 않은 것) 한 것 같습니다. 따라서 파일은 이미 올바른 위치에 있습니다. 하지만 자식은 그것을 인식하지 않는 것 같습니다. – JBCP

+0

병합이 어떻게 정리되는지는 중요하지 않습니다.이를 수행하여 인덱스에서 변경 사항을 얻을 수 있다면 리베이스를 계속할 수 있어야합니다. git이 실제로 혼란 스럽다면 두 트리의 복사본 (예 : diff3 사용)에서 리베이스 트리로 파일 별 병합을 수행하고 git mv를 수행하는 스크립트를 작성해야 할 수도 있습니다 병합 된 파일을 어디에 두어야하는지. – antlersoft

답변

1

기록 수정이 포함 된 최상의 해결책은 아닙니다. git filter-branch을 사용하여 '메트릭'지점의 /java/**/*.java 파일을 /src/main/java/**/*.java으로 옮긴 다음 리베이스를 수행 할 수 있습니다. 먼저 저장소를 백업하십시오. 효과적으로 그 경로 /src/main/java-/java/로 시작하는 모든 파일을 이동,

git checkout metrics 
git filter-branch --index-filter ' 
    git ls-files -s | 
     perl -pe "s{\t/java/\"?}{\t/src/main/java/}" | 
     GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && 
    mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE 
' HEAD 

하여 측정 지점의 역사를 다시 작성합니다 : 그럼 이런 식으로 뭔가를하려고합니다. 이러한 경로에 java 파일 만 원할 경우 perl 문을 적절하게 수정하십시오. 당신의 역사에서 다양한 시점에 git ls-files -s | perl -pe <substitution>을 가지고 주위를 조종하면 필요한 것을 결정하는 데 도움이 될 것입니다.

Git (tm)으로 수행 할 수있는 작업 위의 내용은 매우 과감한 내용입니다. 모두 똑같이 파일 이름 문제를 해결해야합니다. 몇 가지 길다란 분기 합병을 시도한 후에,이 특별한 문제는 마지막 것이 아닙니다. 워크 플로우에서 분기점, 장기 분기가 규칙적으로 생성되는 경우이를 변경하는 것이 좋습니다.

관련 문제