2012-04-17 1 views
5

다음 사례를 고려하십시오.원래 이름이 알려진 이름이 바뀐 파일의 새 경로를 찾는 방법은 무엇입니까?

메인 브랜치에서 리팩터링이 수행되는 동안 로컬 브랜치에서 작업하고 있습니다. 이제 일부 파일 (클래스)의 이름이 바뀌거나 새 위치로 이동되었습니다. 병합 할 때 누락 된 클래스로 인해 많은 가져 오기 오류가 발생합니다. A에서

--A--B--C--D--E-- (master) 
    \   \ 
    F--G--H--I--J (topic) 

이전 이름은 내가 F--G--H--I에 사용 느릅 나무가있다.

B--C--D--E에서 파일은 리팩토링되어 E에 새 파일 이름이 생성됩니다. 체인 포함 이는 내 분기에 누락 된 리팩토링 많은 (컴파일) 오류가 J에서

B: path/to/File.java    
-> C: path/to/BetterName.java 
-> D: better/package/BetterName.java 
-> E: final/package/FinalName.java 

같은 지금 병합 결과를 이름을 바꿉니다. 난 아직 깨진 빌드를 해결하기 위해 final.package.FinalName

대신 path.to.File을 참조하기 때문에 (내가 이전 클래스의 새 이름을 알 필요가있다.

이있는 모든 이름 바꾸기를 얻을 수있는 자식 명령이 있나요 특정 파일에 적용 되었습니까?

+0

스크립트의 작업을 수행에 옵션 alias.history=!bash -ic 'git_file_history "[email protected]"' -을 추가? 그렇다면 나는 당신의 질문을 얻지 못한다 – CharlesB

+0

네,하지만 위의 스크립트보다 간단한 해결책이 있는지 궁금 해서요. 나는 모든 파일을 위해 그것을해야한다. – helt

+0

'-M' 옵션을 사용하여 이름을 찾으려면'git log' 명령을 사용해야합니다. 그런 다음 이름 바꾸기 만보고 싶으면'--diff-filter' 옵션을 사용하십시오. 내 대답에 대한 자세한 내용을 추가했습니다. –

답변

0

힘내라 파일의 이름을 찾아야하지만 파일에 50 % 이상의 행이 변경되면 더 이상 이름이 변경되지 않습니다. 원하는 경우 임계 값

여기에 명령이 있습니다 :

git log -M --diff-filter=R --stat 

이름 만 표시됩니다. 기본 50 %가 아닌 다른 뭔가 다른 임계 값을 변경하려는 경우, 당신은 단지 M 옵션에 숫자를 추가 할 수 있습니다

git log -M90 --diff-filter=R --stat 

이름으로 내용이 더 이상 변경 한 경우에만 파일을 고려할 것

UPDATE 10 % 이상 :

모든 중간 단계를 생략하는 대신 DIFF 사용합니다. Git은 이름 바꾸기를 따릅니다.

git diff -M --diff-filter=R --name-status ..master | cut -f2- 

토픽 브랜치를 사용하고있을 때.

그런 다음 파이프를 사용하여 일련의 sed 명령을 만들어 참조를 조정할 수 있습니다.

+0

명령이 매우 유용하지만 내 목표를 달성하기 위해 계속 긁어 야합니다. – helt

+0

무엇을 원하니? 출력을 원하는대로 형식을 지정할 수 있습니다. 필요한 경우 몇 가지 명령으로 파이프 할 수 있어야합니다. 당신은 당신의 역사를 걸어 갈 필요가 없습니다. –

+0

'git log -M --diff-filter = R --name-status --reverse'는 필요한 순서대로 (가장 오래된 것부터) 모든 이름 변경 목록을 제공합니다. 그러나 나는 옛 이름 만 가지고있다. 문제는 이전 이름의 직접적인 이름 바꾸기를 찾는 것이 아니라 이후의 모든 연속적인 이름 바꾸기를 찾는 것입니다. 바라기를 그 다소 이해할 수있다. – helt

-1

나는 웹에 만족스러운 답을 찾을 수 없습니다, 그래서 내가 위의 예에서 제공과 함께 스크립트를 사용

(이름 바꾸기로 이름 변경) 하나 하나 로그를 통해 갈 (어색한) 스크립트를 작성했습니다 follwing을 출력 :

$ git history path/to/File.java

final/package/FinalName.java

,

나는 나의 ~.bashrc에 스크립트를 추가하고 내 글로벌 자식 설정

#! /bin/sh 
### Takes a filename as parameter ($1) 
### Echoes all filenames related to $1 
function git_file_history() { 
     loc_var=$1; 
     old="" 
     while [ "$loc_var" != "$old" ] && [ "$loc_var" != "" ] 
     do 
       old=$loc_var; 
       #echo $loc_var; 
       hashes=$(git log --format="%P %H" -1 --follow -- $loc_var); 
       status=$(git diff --name-status --find-renames $hashes | grep $loc_var); 
       awks=`echo $status | awk '{print $3}'` 
       loc_var=$awks; 
     done 
     echo "$loc_var"; 
} 
관련 문제