Git의 filter-branch 명령은 강력하지만 수정해야 할 작성자가 두 명 이상인 경우와 같이 사소한 것이 아닌 경우에는 사용하기가 끔찍합니다.
다음은 git-shortlog 맨 페이지에 설명 된 .mailmap 기능을 사용하는 유용한 대안입니다. 이것은 git log의 형식화 기능과 함께 사용할 수있는 작성자 매핑 메커니즘을 제공합니다. 이름 지정된 커밋 시퀀스를 선택하고 수정하는 명령을 생성하는 데 사용할 수 있습니다.
예를 들어, $ START 커밋에서 시작하여 브랜치 $ BRANCH의 저작권을 수정한다고 가정합니다.
기존 작성자 이름을 올바른 저자 이름으로 맵핑하는 저장소의 최상위 디렉토리에 .mailmap 파일을 작성해야합니다. 다음을 사용하여 기존 작성자 이름 목록을 얻을 수 있습니다.
git shortlog -se
다음과 같은 .mailmap 파일로 끝나야합니다 (예 :).
You <you@somewhere.org> cowens@localmachine
You <you@somewhere.org> root@localmachine
이제 git log의 형식화 기능을 사용하여 $ BRANCH를 $ BRANCH2로 다시 쓰는 명령을 생성 할 수 있습니다.
git checkout -b $BRANCH2 $START
git log --reverse --pretty=format:"cherry-pick %H; commit --amend --author='%aN <%aE>' -C %H" $START..$BRANCH | sh -
첫 번째 명령은 커밋 $ START에서 새 빈 분기 싹을 만듭니다. $ START와 $ BRANCH 사이의 각 커밋에 대해 두 번째 명령 cherry는 현재 분기 $ BRANCH2의 끝에서 원래 커밋을 선택하고 작성자를 올바르게 설정하도록 수정합니다.
이것은 또한 일반적으로 적용 가능합니다-~ / .gitconfig에 넣으십시오.
[alias]
# git reauthor $START..$END
reauthor = !sh -c 'eval `git log --reverse --topo-order --pretty=format:\"git cherry-pick %H && git commit --amend -C %H --author=\\\"%aN <%aE>\\\" && \" $0 ` "echo success" '
따라서 작성자를 수정해야하는 경우 이제 .mapfile을 생성하고 다음을 수행해야합니다.
git checkout -b $BRANCH2 $START
git reauthor $START..$BRANCH
원래 브랜치 참조를 새 브랜치로 재 할당하고 새 브랜치 참조를 삭제할 수 있습니다.
git checkout $BRANCH
git reset --hard $BRANCH2 # be careful with this command
git branch -d $BRANCH2
git
를 위해 : 이와 유사한 목적으로 사용하는 것에 대한 질문은 Stack Overflow 에서 더 잘 부탁드립니다 .