GIT의 여러 커밋의 저자 및 커미터 이름과 전자 메일을 변경하는 방법은 무엇입니까?


질문

 

나는 학교 컴퓨터에 간단한 스크립트를 작성하고, Git의 변경 사항을 저지른 (내 펜 드라이브에있는 Repo에서 집에서 컴퓨터에서 복제)되었습니다.몇 가지 커밋 후, 나는 루트 사용자로서 물건을 저지른 것을 깨달았습니다.

이 커밋의 저자를 제 이름으로 바꿀 수있는 방법이 있습니까?


답변

 

참고 :이 답변은 SHA1S를 변경하므로 이미 푸시 된 지점에서 사용할 때주의하십시오.이름의 맞춤법을 수정하거나 이전 이메일을 업데이트하려는 경우 .mailmap을 사용하여 기록을 다시 작성하지 않고이 작업을 수행 할 수 있습니다.내 다른 대답을 보아라.

Rebase를 사용하여

첫째, 아직 수행하지 않은 경우 git-config에서 이름을 수정하려는 것 같습니다.

git config --global user.name "New Author Name"
git config --global user.email "<email@address.com>"

이는 선택 사항이지만, 이렇게하면 커미터 이름을 재설정해야합니다.

리베이스를 사용하여 범위 범위의 범위에 대한 메타 데이터를 다시 작성하려면

git rebase -r <some commit before all of your bad commits> \
    --exec 'git commit --amend --no-edit --reset-author'

- exec은 각 커밋이 다시 작성된 후 Git 커밋 단계를 실행합니다 (마치 Git Commit && Git Rebase - 반복적으로 rebase --continue).

첫 번째 커밋 ( '루트'커밋이라고도 함)을 변경하려면 리베이스 호출에 --root를 추가해야합니다.

이렇게하면 committer.name/User.Email 구성에 대한 커미터와 작성자가 모두 변경됩니다.해당 구성을 변경하지 않으려면 --reset-japer 대신 --Author "New Author Name "을 사용할 수 있습니다.그렇게하는 것은 이렇게하면 커미터 - 저자 만 업데이트하지 않습니다.

단일 커밋

가장 최근의 커밋을 변경하고 싶다면 리베이 효소가 필요하지 않습니다.그냥 커밋을 수정하십시오 :

 git commit --amend --no-edit --reset-author

이전 GIT 고객의 경우 (7 월 2020 일)

-r, - Rebase-merges가 당신을 위해 존재하지 않을 수 있습니다.대체품으로, 당신은 -p을 사용할 수 있습니다.-p는 심각한 문제가 있으며 이제는 더 이상 사용되지 않습니다.



답변

이 답변은 문서가이 경고를 제공하는 git-filter-branch를 사용합니다. Git Filter-Branch는 의도 된 역사 재 작성의 비 분리되지 않은 압착을 일으킬 수있는 플터 라를 가지고 있으며 그러한 심합 성능이 있으므로 그러한 문제를 조사하기 위해 거의 시간을 남길 수 있습니다.이러한 안전 및 성능 문제는 역소하게 고정 될 수 없으며 그 사용은 권장되지 않습니다.Git Filter-Repo와 같은 대체 이력 필터링 도구를 사용하십시오.여전히 Git Filter-Branch를 사용해야하는 경우 필터 분기의 랜드 광산에 대해 알아 보려면 안전 (및 성능)을 조심스럽게 읽으십시오.

저자 (또는 커미터)를 변경하려면 모든 기록을 다시 작성해야합니다.괜찮 으면 그 가치가 있다고 생각하면 Git Filter-Branch를 확인해야합니다.매뉴얼 페이지에는 시작하기위한 몇 가지 예제가 포함되어 있습니다.또한 사용자 환경 변수를 사용하여 작성자, 커미터, 날짜 등의 이름을 변경할 수 있습니다 - Git Manual 페이지의 "환경 변수"절을 참조하십시오.

특히이 명령을 사용하여 모든 분기 및 태그에 대한 모든 잘못된 작성자 이름과 전자 메일을 수정할 수 있습니다 (소스 : github 도움말).

#!/bin/sh

git filter-branch --env-filter '
OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

대체 이력 필터링 도구 Git Filter-Repo를 사용하려면 먼저 GitMailMap 형식에 따라 Git-MailMap을 구성 할 수 있습니다.

Proper Name <proper@email.xx> Commit Name <commit@email.xx>

생성 된 메일 맵으로 필터 -po를 실행합니다.

git filter-repo --mailmap git-mailmap


답변

하나의 라이너가 있지만 다중 사용자 저장소가있는 경우 조심해야합니다. 이렇게하면 모든 커밋이 동일한 (새로운) 작성자 및 커미터를 갖도록 변경합니다.

git filter-branch -f --env-filter "GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='new@email'; GIT_COMMITTER_NAME='Newname'; GIT_COMMITTER_EMAIL='new@email';" HEAD

문자열의 linebreaks (bash에서 가능) :

git filter-branch -f --env-filter "
    GIT_AUTHOR_NAME='Newname'
    GIT_AUTHOR_EMAIL='new@email'
    GIT_COMMITTER_NAME='Newname'
    GIT_COMMITTER_EMAIL='new@email'
  " HEAD


답변

당신은 또한 할 수 있습니다 :

git filter-branch --commit-filter '
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi' HEAD

참고, Windows 명령 프롬프트 에서이 명령을 사용하는 경우 "대신"을 사용해야합니다.

git filter-branch --commit-filter "
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi" HEAD


답변

초기화 된 $ HOME / .gitconfig가없는 경우 발생합니다.다음과 같이 해결할 수 있습니다.

git config --global user.name "you name"
git config --global user.email you@domain.com
git commit --amend --reset-author

Git 버전 1.7.5.4로 테스트되었습니다.

이것은 마지막 커밋 만 수정합니다.



답변

상위 소수의 커밋만이 나쁜 작가가있는 경우 다음과 같이 EXEC 명령과 - 계명 커밋을 사용하여 GIT Rebase -i 내 에서이 작업을 수행 할 수 있습니다.

git rebase -i HEAD~6 # as required

편집 가능한 커밋 목록을 제공합니다.

pick abcd Someone else's commit
pick defg my bad commit 1
pick 1234 my bad commit 2

그런 다음 exec ... --author = "..."나쁜 작성자가있는 모든 줄이 끝난 후에 :

pick abcd Someone else's commit
pick defg my bad commit 1
exec git commit --amend --author="New Author Name <email@address.com>" -C HEAD
pick 1234 my bad commit 2
exec git commit --amend --author="New Author Name <email@address.com>" -C HEAD

편집기를 저장하고 종료하십시오 (실행).

이 솔루션은 다른 것들보다 오랜 시간이 걸릴 수 있지만 매우 통제 할 수 있습니다 - 나는 그것이 무엇을 저지르는지 정확히 알고 있습니다.

영감을주는 @asmeurer 덕분에.

출처:https://stackoverflow.com/questions/750172/how-to-change-the-author-and-committer-name-and-e-mail-of-multiple-commits-in-gi