카테고리 보관물: Git

Git

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

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에서 개선되었습니다 .