programing

Git, 이전 커밋 사용자 이름 및 이메일 다시 쓰기

lovejava 2023. 5. 9. 21:58

Git, 이전 커밋 사용자 이름 및 이메일 다시 쓰기

저는 Github의 프로젝트에 많은 커밋을 했지만, 제가 커밋을 하기 위해 현재 사용하는 컴퓨터에서 적절한 이메일과 커밋 전체 이름을 설정하지 않았다는 것을 깨달았습니다. 따라서 사용자 아바타와 이메일 주소가 없습니다.

과거의 커밋 이메일과 사용자 이름을 모두 다시 작성하려면 어떻게 해야 합니까?

이 별칭을 추가할 수 있습니다.

git config --global alias.change-commits '!'"f() { VAR=\$1; OLD=\$2; NEW=\$3; shift 3; git filter-branch --env-filter \"if [[ \\\"\$\`echo \$VAR\`\\\" = '\$OLD' ]]; then export \$VAR='\$NEW'; fi\" \$@; }; f"

작성자 이름 변경하기

git change-commits GIT_AUTHOR_NAME "old name" "new name"

또는 최근 10개 커밋에 대한 이메일:

git change-commits GIT_AUTHOR_EMAIL "old@email.com" "new@email.com" HEAD~10..HEAD

별칭:

change-commits="!f() { VAR=$1; OLD=$2; NEW=$3; shift 3; git filter-branch --env-filter \"if [[ \\\"$`echo $VAR`\\\" = '$OLD' ]]; then export $VAR='$NEW'; fi\" \$@; }; f"

출처: https://github.com/brauliobo/gitconfig/blob/master/configs/ .gitconfig

다음을 참조:

git filter-branch -f --env-filter \
"GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='newemail'; \
GIT_COMMITTER_NAME='committed-name'; GIT_COMMITTER_EMAIL='committed-email';" HEAD

일부 커밋을 공용 리포지토리에 이미 밀어넣은 경우 이 작업을 수행하지 마십시오. 그렇지 않으면 다른 사용자가 사용한 마스터 기록의 대체 버전이 만들어집니다."개천을 건너지 마"안 좋을 것 같아요.."

에 이 하십시오."라는 메시지가 표시됩니다.당신은 할 수 .git filter-branch합니다.--commit-filter다음과 같이 잘못된 정보와 일치하는 커밋만 편집합니다.

git filter-branch --commit-filter '
      if [ "$GIT_AUTHOR_EMAIL" = "wrong_email@wrong_host.local" ];
      then
              GIT_AUTHOR_NAME="Your Name Here (In Lights)";
              GIT_AUTHOR_EMAIL="correct_email@correct_host.com";
              git commit-tree "$@";
      else
              git commit-tree "$@";
      fi' HEAD

올리비에 베르디에의 대답을 적용한 후:

git filter-branch -f --env-filter \
"GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='newemail'; \
GIT_COMMITTER_NAME='committed-name'; GIT_COMMITTER_EMAIL='committed-email';" HEAD

...변경된 기록을 원래 리포지토리에 푸시하려면 다음을 사용합니다.

git push origin +yourbranch

위의 명령(플러스 기호 참조)은 원래 레포에도 기록을 다시 씁니다.조심해서 사용하세요!

다시 한 번 경고: 모든 커밋이 새 이름/새 전자 메일에 의해 커밋된 것으로 변경됩니다!이 시나리오에서는 실수로 다른 ID를 사용하도록 커밋한 한 명의 작성자만 포함된 레포를 가지고 있으며 이를 수정하려는 경우가 있습니다.

의사을고한려의 git-filter-branchgit-filter-repo에서 동일한 작업을 수행하는 것은 바람직하지 않습니다(먼저 설치해야 할 수 있음).pip install git-filter-repo):

git-filter-repo --name-callback 'return name.replace(b"OldName", b"NewName")' --email-callback 'return email.replace(b"old@email.com", b"new@email.com")'

" " " " " " " 를 해야 합니다.--force 작업을 할 수도 있습니다.)

참고 을 보존하고 않다면 (Git GUI의 입니다), 은 참고 문헌을 할입니다.--replace-refs delete-no-add.

자세한 고급 기능은 "이름 및 전자우편 필터링"을 참조하십시오.

추신: https://stackoverflow.com/a/59591928/714907 에서 도난당하고 개선되었습니다.

https://help.github.jp/enterprise/2.11/user/articles/changing-author-info/

#!/bin/sh

git filter-branch --env-filter '

OLD_EMAIL="oldEmail@xxx-MacBook-Pro.local"
CORRECT_NAME="yourName"
CORRECT_EMAIL="yourEmail"

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

이것은 완전히 나에게 효과가 있었습니다.깃 푸시 후 깃의 웹 포털에서 업데이트를 확인하십시오.커밋이 여전히 내 계정에 연결되지 않고 커밋 옆에 기본 섬네일 이미지가 표시되고 내 기여 타임라인 차트에 반영되지 않은 경우, 커밋 URL로 이동하여 URL 끝에 있는 append.patch를 확인합니다.

전자 메일 및 이름 업데이트 외에 간편한 복사 붙여넣기 버전을 원하는 사용자의 경우:

git config alias.change-commits '!'"f() { VAR=\$1; OLD=\$2; NEW=\$3; shift 3; git filter-branch --env-filter \"if [[ \\\"\$\`echo \$VAR\`\\\" = '\$OLD' ]]; then export \$VAR='\$NEW'; fi\" \$@; }; f "
git change-commits GIT_AUTHOR_NAME "<Old Name>" "<New Name>" -f
git change-commits GIT_AUTHOR_EMAIL <old@email.com> <new@email.com> -f
git change-commits GIT_COMMITTER_NAME "<Old Name>" "<New Name>" -f
git change-commits GIT_COMMITTER_EMAIL <old@email.com> <new@email.com> -f

이미 존재하는 답변이 완료되었습니다.하지만 정말로, 그것들이 필요하신가요?예를 들면.저도 비슷한 문제에 직면해 있었지만, 여기서의 답변은 그 경우에 비해 과도했습니다.나의 사례와 해결책은 아래에 설명되어 있습니다.

메일 ID인 두개이가일있가다니정합고다메의▁ids,▁email▁two다▁you▁assume▁have니가정합가두가 있다고 가정합니다.no_longer_want@gmail.com그리고.want@gmail.com이전 커밋이 완료되었을 가능성이 있습니다.no_longer_want@gmail.com당신이 원하는 이메일 ID가 아닙니다.는, 한 연결하는 입니다.want@gmail.comGitHub 계정으로 이동합니다.

어떻게 하는 거지?

설정 페이지의 전자 메일 섹션에서 전자 메일을 추가하는 옵션을 찾습니다.

여기에 이미지 설명 입력

아직도 길을 잃었나요?

github 페이지에 언급된 첫 세 단계로 충분할 것입니다.

참고:

  1. Github은 단일 Github 계정에 대해 여러 전자 메일 ID를 지원합니다.
  2. 이메일 ID를 교체하는 것이 아니라 새 이메일 ID를 추가하는 것이기 때문에 두 이메일 ID를 통한 커밋은 Github 계정에 연결됩니다.
  3. want@gmail.com기본 전자 메일 ID로 설정해야 합니다.

로컬 저장소 표시 이름에 주로 관심이 있는 경우 기록을 다시 작성하는 대신 기본적으로 이름 및 전자 메일 목록인 를 사용할 수 있습니다.예를 들어, 이것을 배치하는 것은.mailmaprepo :

Tamika Page <tamika@somejob.com>
Orlando Cervantes <orlando.cervantes@otherjob.com> Orlando Jackson <orlando.jackson@otherjob.com>
Jared Michael <jared.michael@gmail.com> <jared@desktop.(none)>

에 귀속되는 커밋이 발생합니다.tamkia@somejob.com이름에 Page라는 은 다음과 .Orlando Jackson <orlando.jackson@otherjob.com>올랜도 세르반테스로 전시되는 것, 그리고 성가신 것.<jared@desktop.(none)>jared.michael@gmail.com자세한 내용은 이 기능에 대한 Git 설명서를 참조하십시오. Git에 내장되어 있으므로 합리적으로 새로운 Git 클라이언트에서 사용할 수 있습니다.

하지만 여기에는 큰 경고가 있습니다. 공식 Git 클라이언트에서 꽤 오랫동안 지원되었지만, 다양한 Git 구현, 특히 빅 웹 인터페이스에서의 지원은 보장되지 않습니다. GitHub가 이를 존중하는지 여부에 대한 합의가 엇갈리지만 부정적으로 보이는 이 질문을 보십시오.GitHubGitLab에 빠른 테스트 저장소를 구축했지만 둘 다 관심이 없는 것 같습니다..mailmap,불행하게도.

@paradocslover의 답변에서 언급했듯이, 서비스에는 유사한 작업을 수행할 수 있는 자체 인터페이스가 있지만, 서비스별로 설정해야 하며, 로컬 복사본에는 전혀 영향을 주지 않습니다.왜냐면.mailmaprepo의 일부이며, 사용자의 repo를 복제하는 모든 사용자에게 로컬로 작동합니다(위에 링크된 repo를 복제하여 직접 확인할 수 있습니다). 하지만 테스트한 웹 인터페이스에는 표시되지 않는 것 같습니다.

물론 어떤 경우에는 역사를 다시 쓰고 싶지만, 그것은 다소 침해적일 수 있고 모든 표준 경고와 함께 제공되기 때문에, 어떤 경우에는 특히 다시 쓰는 것이 실용적이지 않은 경우에는 이 옵션이 충분할 수도 있습니다.

언급URL : https://stackoverflow.com/questions/2919878/git-rewrite-previous-commit-usernames-and-emails