힘내, 이전 커밋 사용자 이름과 이메일을 다시 작성 커밋했지만 커밋을 위해 현재

Github의 프로젝트에 많은 커밋을 커밋했지만 커밋을 위해 현재 사용중인 컴퓨터에서 올바른 전자 메일과 커미터 전체 이름을 설정하지 않았으므로 사용자 아바타 및 전자 메일 주소를 알았습니다. 거기 없다.

과거 커밋 이메일과 사용자 이름을 어떻게 다시 쓸 수 있습니까?



답변

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

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"

또는 최근 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에서 여러 커밋의 작성자와 커미터 이름 및 전자 메일 변경

즉,

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

답변

Olivier Verdier의 답변을 적용한 후 :

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

위의 명령 (더하기 참고)은 원래 리포지토리에 기록을 다시 쓰도록 강제합니다. 주의해서 사용하십시오!


답변

https://help.github.com/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

이것은 완전히 나를 위해 일했습니다. git push 후 git 웹 포털에서 업데이트를 확인하십시오. 커밋이 여전히 내 계정에 연결되어 있지 않은 경우 커밋 옆에 기본 축소판 이미지가 표시되고 내 기여 일정표에 반영되지 않은 경우 커밋 URL로 이동하여 URL 끝에 .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

답변

의 사용을 고려 git-filter-branch한다 바람직하지 에 같은 일을 할 수있는, 자식 필터 – 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 .

고급 기능에 대해서는 “이름 및 이메일 필터링”을 참조하십시오 .

PS 도난 및 https : //.com/a/59591928/714907에서 개선되었습니다 .