이전 커밋에서 내 이름과 성을 변경할 수 있습니까?


답변:


212

사용 git-filter-branch.

git filter-branch --commit-filter 'if [ "$GIT_AUTHOR_NAME" = "Josh Lee" ];
  then export GIT_AUTHOR_NAME="Hobo Bob"; export GIT_AUTHOR_EMAIL=hobo@example.com;
  fi; git commit-tree "$@"'

이것은 커미터가 아닌 작성자에게만 영향을줍니다 (대부분의 커밋에서 작성자와 동일 함). 이것도 다시 작성하려면 GIT_COMMITTER_NAMEGIT_COMMITTER_EMAIL변수를 설정하십시오 .

표준 경고 역사 적용을 재 작성에 대한; 아직 공유되지 않은 역사에만 그렇게하십시오.

2018 년 6 월 업데이트

이제 설명서에는 https://git-scm.com/docs/git-filter-branch#_examples--env-filter 예제에를 사용하는 솔루션이 포함되어 있습니다 .

git filter-branch --env-filter '
    if test "$GIT_AUTHOR_EMAIL" = "root@localhost"
    then
        GIT_AUTHOR_EMAIL=john@example.com
    fi
    if test "$GIT_COMMITTER_EMAIL" = "root@localhost"
    then
        GIT_COMMITTER_EMAIL=john@example.com
    fi
' -- --all

4
을 사용하는 경우 msysgit에도에 액세스 할 수 bash있습니다. 그렇지 않으면 단서가 없습니다.
Josh Lee

@Joshua 만약 당신이 bash가없는 곳에서 무언가를 사용한다면, 내가 그것을 시도하지는 않았지만 아마 윈도우 배치 스크립팅을 사용할 수있을 것입니다.
MatrixFrog 2010

태그는 어떻습니까? 이 솔루션은 태그의 저자 변경되지 않습니다
piotrek

@Joshua는 리눅스 상자에서 git repo를 확인하고 거기에서 수정을 수행합니다.
Will Sheppard

새 분기를 생성하고 소스 커밋을 그대로 두는 옵션이 있습니까?
Eugen Konkov 2018 년

56

선택한 모든 커밋에서 작성자와 커미터를 모두 다시 작성하려면 :

git filter-branch --commit-filter \
'if [ "$GIT_AUTHOR_NAME" = "OldAuthor Name" ]; then \
export GIT_AUTHOR_NAME="Author Name";\
export GIT_AUTHOR_EMAIL=authorEmail@example.com;\
export GIT_COMMITTER_NAME="Commmiter Name";\
export GIT_COMMITTER_EMAIL=commiterEmail@example.com;\
fi;\
git commit-tree "$@"'

1
그러나 원격 서버에 변경 사항을 적용하는 방법은 무엇입니까?
vikyd

5
시도 @Vikygit push --all origin --force
user11153

2
그것은 나를 위해 작동합니다! GitLab을 사용하고 있으며 push 명령 전에 분기 보호를 해제해야합니다.
vikyd

37

다른 작성자가없는 경우 다음을 수행 할 수 있습니다.

git filter-branch --commit-filter 'export GIT_AUTHOR_NAME="authorname"; \
export GIT_AUTHOR_EMAIL=mail@example.com; git commit-tree "$@"'

1
"Committer :"정보를 다시 작성하지 않습니다.
user11153 2014 년

1
커미터 정보를 다시 작성하기위한 것이 아닙니다. 그렇게하려면 GIT_COMMITTER_NAME 및 GIT_COMMITTER_EMAIL도 내보내십시오 (허용 된 답변 참조).
chronospoon 2014

12

아래 스크립트를 예를 들어 저장 ~/.bin/git-replace-author하고 다음을 사용하여 실행하십시오.

git replace-author "John Ssmith" "John Smith" "johnsmith@example.com"

인수가 없으면 Git 구성에 따라 현재 이메일 주소를 사용하도록 모든 커밋을 사용자 이름으로 업데이트합니다.

DEFAULT_NAME="$(git config user.name)"
DEFAULT_EMAIL="$(git config user.email)"
export OLD_NAME="${1:-$DEFAULT_NAME}"
export NEW_NAME="${2:-$DEFAULT_NAME}"
export NEW_EMAIL="${3:-$DEFAULT_EMAIL}"

echo "Old:" $OLD_NAME "<*>"
echo "New:" "$NEW_NAME <$NEW_EMAIL>"
echo "To undo, use: git reset $(git rev-parse HEAD)"

git filter-branch --env-filter \
'if [ "$GIT_AUTHOR_NAME" = "${OLD_NAME}" ]; then
    export GIT_AUTHOR_NAME="${NEW_NAME}"
    export GIT_AUTHOR_EMAIL="${NEW_EMAIL}"
    export GIT_COMMITTER_NAME="${NEW_NAME}"
    export GIT_COMMITTER_EMAIL="${NEW_EMAIL}"
fi'

원시 (다운로드)


간단히 말해서 : ~/.bin/사용자 내부에 $PATH있어야하고 파일이 실행 가능해야하므로 다음을 실행하십시오 chmod +x ~/.bin/git-replace-author..
Michael Gecht

그리고 그것은 논쟁으로 무엇을합니까?
Eugen Konkov 2018 년

2

당신이 세상에 당신의 커밋을 푸시하지 않은 경우에만. 다른 현명한 사람은 모두 자신의 레포에 이전 이름이 있으므로 모든 사람을 변경할 수 없습니다.


사실이지만 어떤 경우에는 선택의 여지가 없습니다. 제 경우에는 git config에 잘못된 이메일 주소가 구성되어 있습니다 ( "git config --global -l"로 볼 수 있음). 결과적으로 내 자신의 Github 저장소에 커밋 활동이 표시되지 않았습니다 (이메일 주소가 Github에서 구성된 이메일과 일치하지 않았기 때문)! 이 문제를 해결하기 위해 stackoverflow.com/a/23564785/2474068 (완벽하게 작동) 의 레시피를 사용하여 로컬 커밋을 수정 한 다음 "git push -u -f origin master"를 사용하여 변경된 커밋을 Github에 푸시했습니다 (강제 사용 플래그 "-f"). 그것은 수용된 관행에 위배되지만 선택의 여지가 없었습니다!
leo

1
예, 내 요점은 해당 리포지토리의 포크가 귀하의 강제 푸시를 수락하지 않으면 변경 사항이 없다는 것입니다. 모든 포크를 업데이트하는 것은 어려울 수 있습니다. :)
EnabrenTane

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.