etc./StackOverFlow

Git에서 여러 커밋의 작성자 및 커미터 이름과 이메일을 변경하는 방법은 무엇입니까?

청렴결백한 만능 재주꾼 2021. 11. 19. 23:42
반응형

질문자 :Flávio Amieiro


나는 학교 컴퓨터에서 간단한 스크립트를 작성하고 Git에 변경 사항을 커밋했습니다(내 펜드라이브에 있는 저장소, 집에 있는 내 컴퓨터에서 복제됨). 몇 번 커밋한 후 루트 사용자로 커밋하고 있음을 깨달았습니다.

이 커밋의 작성자를 내 이름으로 변경할 수 있는 방법이 있습니까?



참고: 이 답변은 SHA1을 변경하므로 이미 푸시된 분기에서 사용할 때 주의하십시오. 이름의 철자를 수정하거나 오래된 이메일을 업데이트하려는 경우 git을 사용하면 .mailmap 사용하여 기록을 다시 작성하지 않고 이 작업을 수행할 수 있습니다. 내 다른 답변을 참조하십시오.

대화형 Rebase 사용

당신은 할 수 있습니다

 git rebase -i -p <some HEAD before all of your bad commits>

그런 다음 rebase 파일에서 모든 잘못된 커밋을 "편집"으로 표시하십시오. 첫 번째 커밋도 변경하려면 rebase 파일의 첫 번째 라인으로 수동으로 추가해야 합니다(다른 라인의 형식을 따름). 그런 다음 git이 각 커밋을 수정하도록 요청할 때 다음을 수행하십시오.

 git commit --amend --author "New Author Name <email@address.com>"

열리는 편집기를 편집하거나 닫은 다음

 git rebase --continue

리베이스를 계속합니다.

명령이 --no-edit 를 추가하여 여기에서 편집기 열기를 건너뛸 수 있습니다.

 git commit --amend --author "New Author Name <email@address.com>" --no-edit && \ git rebase --continue

단일 커밋

일부 댓글 작성자가 언급했듯이 가장 최근 커밋만 변경하려는 경우 rebase 명령이 필요하지 않습니다. 그냥 해

 git commit --amend --author "New Author Name <email@address.com>"

이렇게 하면 작성자가 지정된 이름으로 변경되지만 커미터는 git config user.namegit config user.email 에서 구성된 사용자로 설정됩니다. 커미터를 지정한 것으로 설정하려는 경우 작성자와 커미터가 모두 설정됩니다.

 git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author

병합 커밋에 대한 참고 사항

원래 답변에 약간의 오류가 있었습니다. HEAD<some HEAD before all your bad commits> 사이에 병합 커밋이 있으면 git rebase 가 이를 병합합니다(그런데 GitHub pull 요청을 사용하면 병합이 엄청나게 많이 될 것입니다. 기록에 커밋). 이것은 매우 자주 매우 다른 기록으로 이어질 수 있으며(중복된 변경 사항이 "리베이스 아웃"될 수 있으므로) 최악의 경우 git rebase 어려운 병합 충돌(이미 병합에서 해결되었을 가능성이 있음)을 해결하도록 요청할 수 있습니다. 커밋). 해결책은 -p 플래그를 git rebase 에 사용하여 기록의 병합 구조를 보존하는 것입니다. git rebase 맨페이지는 -p-i 를 사용하면 문제가 발생할 수 BUGS 섹션에는 "커밋을 편집하고 커밋 메시지를 다시 작성하면 제대로 작동해야 합니다."라고 나와 있습니다.

위의 명령 -p 를 추가했습니다. 가장 최근 커밋을 변경하는 경우에는 문제가 되지 않습니다.

최신 git 클라이언트용 업데이트(2020년 7월)

-p 대신 --rebase-merges 를 사용합니다( -p 는 더 이상 사용되지 않으며 심각한 문제가 있음).


asmeurer

이 답변은 git-filter-branch 를 사용 하여 문서에서 이제 다음 경고를 표시합니다.

git filter-branch에는 의도한 기록 다시 쓰기의 명확하지 않은 맹글링을 생성할 수 있는 많은 함정이 있습니다(그리고 그러한 성능이 매우 좋지 않기 때문에 이러한 문제를 조사할 시간이 거의 없을 수 있음). 이러한 안전 및 성능 문제는 이전 버전과 호환되도록 수정할 수 없으므로 사용하지 않는 것이 좋습니다. git filter-repo 와 같은 대체 기록 필터링 도구를 사용하십시오. 여전히 git filter-branch를 사용해야 하는 경우 SAFETY (및 PERFORMANCE )를 주의 깊게 읽고 filter-branch의 지뢰에 대해 알아본 다음, 거기에 나열된 위험을 최대한 합리적으로 피하십시오.

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

특히 다음 명령을 사용하여 모든 브랜치 및 태그에 대한 잘못된 작성자 이름과 이메일 을 모두 수정할 수 있습니다(출처: 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

Pat Notz

하나의 라이너이지만 다중 사용자 저장소가 있는 경우 주의하십시오. 이렇게 하면 모든 커밋이 동일한(새) 작성자와 커미터를 갖도록 변경됩니다.

 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

문자열에 줄바꿈 사용(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

Brian Gianforcaro

다음을 수행할 수도 있습니다.

 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

당신은 윈도우 명령 프롬프트에서이 명령을 사용하는 경우, 당신은 사용할 필요 " 대신 ' :

 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

Rognon

$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로 테스트


lrkwz

상위 몇 개의 커밋에만 잘못된 작성자가 있는 경우 다음과 같이 exec 명령과 --amend 커밋을 사용하여 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에게 감사드립니다.


Alex Brown

단일 커밋의 경우:

 git commit --amend --author="Author Name <email@address.com>"

(asmeurer의 답변에서 발췌)


blueyed

Github에는 다음과 같은 쉘 스크립트인 멋진 솔루션이 있습니다.

 #!/bin/sh git filter-branch --env-filter ' an="$GIT_AUTHOR_NAME" am="$GIT_AUTHOR_EMAIL" cn="$GIT_COMMITTER_NAME" cm="$GIT_COMMITTER_EMAIL" if [ "$GIT_COMMITTER_EMAIL" = "your@email.to.match" ] then cn="Your New Committer Name" cm="Your New Committer Email" fi if [ "$GIT_AUTHOR_EMAIL" = "your@email.to.match" ] then an="Your New Author Name" am="Your New Author Email" fi export GIT_AUTHOR_NAME="$an" export GIT_AUTHOR_EMAIL="$am" export GIT_COMMITTER_NAME="$cn" export GIT_COMMITTER_EMAIL="$cm" '

Olivier Verdier

docgnome이 언급했듯이 기록을 다시 쓰는 것은 위험하며 다른 사람의 저장소를 손상시킵니다.

그러나 실제로 그렇게 하고 싶고 bash 환경에 있는 경우(Linux에서는 문제가 없고 Windows에서는 git 설치와 함께 제공되는 git bash를 사용할 수 있음) git filter-branch 를 사용하십시오 .

 git filter-branch --env-filter ' if [ $GIT_AUTHOR_EMAIL = bad@email ]; then GIT_AUTHOR_EMAIL=correct@email; fi; export GIT_AUTHOR_EMAIL'

작업 속도를 높이려면 다시 작성하려는 수정 범위를 지정할 수 있습니다.

 git filter-branch --env-filter ' if [ $GIT_AUTHOR_EMAIL = bad@email ]; then GIT_AUTHOR_EMAIL=correct@email; fi; export GIT_AUTHOR_EMAIL' HEAD~20..HEAD

svick

마지막 N 커밋의 작성자를 변경하는 단일 명령:

 git rebase -i HEAD~N -x "git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit"

노트

  • 커밋을 다시 작성하려는 위치까지 HEAD~N 이것은 해시, HEAD~4 , 분기 이름, ...
  • --no-edit 플래그는 git commit --amend 가 추가 확인을 요청하지 않는지 확인합니다.
  • git rebase -i 를 사용하면 작성자를 변경할 커밋을 수동으로 선택할 수 있습니다.

편집한 파일은 다음과 같습니다.

 pick 897fe9e simplify code a little exec git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit pick abb60f9 add new feature exec git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit pick dc18f70 bugfix exec git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit

그런 다음 일부 줄을 수정하여 작성자를 변경할 위치를 확인할 수 있습니다. 이것은 자동화와 제어 사이의 좋은 중간 지점을 제공합니다. 실행될 단계가 표시되고 일단 저장하면 모든 것이 한 번에 적용됩니다.


Chris Maes

이것을 별칭 으로 사용할 수 있으므로 다음을 수행할 수 있습니다.

 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

~/.gitconfig에 추가:

 [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 "

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

유용하기를 바랍니다.


brauliobo

다른 작성자로부터 병합되지 않은 커밋을 인수할 때 이를 처리하는 쉬운 방법이 있습니다.

git commit --amend --reset-author


Ryanmt

이것은 @Brian 버전의 보다 정교한 버전입니다.

작성자와 커미터를 변경하려면 다음을 수행할 수 있습니다(bash에서 가능한 문자열의 줄바꿈 사용).

 git filter-branch --env-filter ' if [ "$GIT_COMMITTER_NAME" = "<Old name>" ]; then GIT_COMMITTER_NAME="<New name>"; GIT_COMMITTER_EMAIL="<New email>"; GIT_AUTHOR_NAME="<New name>"; GIT_AUTHOR_EMAIL="<New email>"; fi' -- --all

다음 오류 중 하나가 나타날 수 있습니다.

  1. 임시 디렉토리가 이미 있습니다.
  2. refs/original로 시작하는 참조가 이미 존재합니다.
    (이는 다른 필터 분기가 이전에 저장소에서 실행되었으며 원래 분기 참조가 refs/original에 백업됨을 의미합니다)

이러한 오류에도 불구하고 강제로 실행하려면 --force 플래그를 추가하십시오.

 git filter-branch --force --env-filter ' if [ "$GIT_COMMITTER_NAME" = "<Old name>" ]; then GIT_COMMITTER_NAME="<New name>"; GIT_COMMITTER_EMAIL="<New email>"; GIT_AUTHOR_NAME="<New name>"; GIT_AUTHOR_EMAIL="<New email>"; fi' -- --all

-- --all 옵션에 대한 약간의 설명이 필요할 수 있습니다. 모든 참조 (모든 분기 포함)의 모든 개정에서 필터 분기가 작동하도록 합니다. 이는 예를 들어 태그도 다시 작성되고 다시 작성된 분기에서 볼 수 있음을 의미합니다.

일반적인 "실수"는 HEAD 대신 사용하는 것입니다. 즉, 현재 분기 에서만 모든 개정을 필터링합니다. 그러면 재작성된 분기에는 태그(또는 다른 참조)가 존재하지 않습니다.


stigkj

유일한 문제가 작성자/이메일이 평소와 다르다면 문제가 되지 않는다는 점을 지적해야 합니다. 올바른 수정은 다음과 같은 행이 있는 디렉토리 베이스에 .mailmap 이라는 파일을 생성하는 것입니다.

 Name you want <email you want> Name you don't want <email you don't want>

git shortlog 와 같은 명령은 두 이름을 동일한 것으로 간주합니다(특별히 하지 말라고 지정하지 않는 한). 자세한 내용은 http://schacon.github.com/git/git-shortlog.html 을 참조하십시오.

이것은 업스트림이 있는 경우 문제를 일으킬 수 있고 항상 실수로 데이터를 손실할 수 있는 좋은 방법인 기록을 다시 작성할 필요가 없다는 점에서 여기의 다른 모든 솔루션의 장점이 있습니다.

물론, 만약 당신이 당신 자신으로 무언가를 커밋했고 그것이 정말로 다른 누군가여야 하고, 이 시점에서 기록을 다시 쓰는 것을 꺼리지 않는다면, 커밋 작성자를 변경하는 것은 아마도 어트리뷰션 목적을 위한 좋은 아이디어일 것입니다(이 경우 나는 당신을 내 여기에 다른 답변이 있습니다).


asmeurer

  1. git rebase -i <sha1 or ref of starting point>

  2. edit (또는 e )으로 변경하려는 모든 커밋을 표시하십시오.

  3. 모든 커밋을 처리할 때까지 다음 두 명령을 반복합니다.

    git commit --amend --reuse-message=HEAD --author="New Author <new@author.email>" ; git rebase --continue

이렇게 하면 다른 모든 커밋 정보(날짜 포함)가 유지됩니다. --reuse-message=HEAD 옵션은 메시지 편집기가 실행되지 않도록 합니다.


sporsh

다음을 사용하여 태그와 모든 분기를 포함하여 전체 저장소의 작성자를 다시 작성합니다.

 git filter-branch --tag-name-filter cat --env-filter " export GIT_AUTHOR_NAME='New name'; export GIT_AUTHOR_EMAIL='New email' " -- --all

이어서 상기에 기재된 바와 같이 필터 분기 MAN 페이지 에 의해 백업 된 모든 원래 심판 제거 filter-branch (이 파괴 백업 제이다)

 git for-each-ref --format="%(refname)" refs/original/ | \ xargs -n 1 git update-ref -d

Ton van den Heuvel

author-conv-file (형식은 git-cvsimport의 형식과 동일)을 수집하여 작동하는 이 솔루션 을 적용했습니다. 모든 분기 author-conv-file 정의된 대로 모든 사용자를 변경하여 작동합니다.

cvs2git 과 함께 사용하여 저장소를 cvs에서 git으로 마이그레이션했습니다.

즉 샘플 author-conv-file

 john=John Doe <john.doe@hotmail.com> jill=Jill Doe <jill.doe@hotmail.com>

스크립트:

 #!/bin/bash export $authors_file=author-conv-file git filter-branch -f --env-filter ' get_name () { grep "^$1=" "$authors_file" | sed "s/^.*=\(.*\) <.*>$/\1/" } get_email () { grep "^$1=" "$authors_file" | sed "s/^.*=.* <\(.*\)>$/\1/" } GIT_AUTHOR_NAME=$(get_name $GIT_COMMITTER_NAME) && GIT_AUTHOR_EMAIL=$(get_email $GIT_COMMITTER_NAME) && GIT_COMMITTER_NAME=$GIT_AUTHOR_NAME && GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL && export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL && export GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL ' -- --all

Leif Gruenwoldt

나는 제시된 버전이 공격적이라는 것을 알았습니다. 특히 다른 개발자의 패치를 커밋하는 경우 이는 본질적으로 코드를 훔칠 것입니다.

아래 버전은 모든 브랜치에서 작동하며 이를 방지하기 위해 작성자와 커미터를 별도로 변경합니다.

모든 옵션에 대해 leif81에 감사드립니다.

 #!/bin/bash git filter-branch --env-filter ' if [ "$GIT_AUTHOR_NAME" = "<old author>" ]; then GIT_AUTHOR_NAME="<new author>"; GIT_AUTHOR_EMAIL="<youmail@somehost.ext>"; fi if [ "$GIT_COMMITTER_NAME" = "<old committer>" ]; then GIT_COMMITTER_NAME="<new commiter>"; GIT_COMMITTER_EMAIL="<youmail@somehost.ext>"; fi ' -- --all

drahnr

  1. Amend 커밋 author name & email 을 변경한 다음 old-commit with new-one 바꿉니다.

     $ git checkout <commit-hash> # checkout to the commit need to modify $ git commit --amend --author "name <author@email.com>" # change the author name and email $ git replace <old-commit-hash> <new-commit-hash> # replace the old commit by new one $ git filter-branch -- --all # rewrite all futures commits based on the replacement $ git replace -d <old-commit-hash> # remove the replacement for cleanliness $ git push -f origin HEAD # force push
  2. 다른 방법 Rebasing :

     $ git rebase -i <good-commit-hash> # back to last good commit # Editor would open, replace 'pick' with 'edit' before the commit want to change author $ git commit --amend --author="author name <author@email.com>" # change the author name & email # Save changes and exit the editor $ git rebase --continue # finish the rebase

Sajib Khan

이를 수행하는 가장 빠르고 쉬운 방법은 git rebase의 --exec 인수를 사용하는 것입니다.

 git rebase -i -p --exec 'git commit --amend --reset-author --no-edit'

이렇게 하면 다음과 같은 할 일 목록이 생성됩니다.

 pick ef11092 Blah blah blah exec git commit --amend --reset-author --no-edit pick 52d6391 Blah bloh bloo exec git commit --amend --reset-author --no-edit pick 30ebbfe Blah bluh bleh exec git commit --amend --reset-author --no-edit ...

이것은 모두 자동으로 작동하며 수백 개의 커밋이 있을 때 작동합니다.


Lie Ryan

filter-branch 대한 더 안전한 대안은 git docs here 에서 filter-repo 도구입니다.

 git filter-repo --commit-callback ' old_email = b"your-old-email@example.com" correct_name = b"Your Correct Name" correct_email = b"your-correct-email@example.com" if commit.committer_email == old_email : commit.committer_name = correct_name commit.committer_email = correct_email if commit.author_email == old_email : commit.author_name = correct_name commit.author_email = correct_email '

위의 명령은 이 스크립트에 사용된 논리를 반영 filter-branch 대신 filter-repo 를 사용합니다.

commit-callback 옵션 이후의 코드 본문은 기본적으로 커밋 처리에 사용되는 파이썬 코드입니다. 여기에서 파이썬으로 자신만의 로직을 작성할 수 있습니다. commit 개체 및 해당 속성에 대한 자세한 내용은 여기를 참조하십시오.

filter-repo 도구는 git에 번들로 제공되지 않으므로 별도로 설치해야 합니다.

전제 조건설치 안내서 참조

python env >= 3.5인 경우 pip 를 사용하여 설치할 수 있습니다.

 pip3 install git-filter-repo

참고 filter-repo 도구를 사용하는 것이 좋습니다. 또한 작업이 완료되면 리모컨이 제거됩니다. 여기에서 리모컨이 제거된 이유에 대해 자세히 알아보세요. 또한 내부 섹션에서 이 도구의 제한 사항을 읽으십시오.


Saurabh P Bhandari

이 리포지토리의 유일한 사용자인 git filter-branch (svick이 쓴 대로 ) 또는 git fast-export / git fast-importplus filter 스크립트(docgnome answer 참조 문서에 설명된 대로)를 사용하여 기록을 다시 작성할 수 있습니다. 또는 대화형 리베이스 . 그러나 둘 중 하나는 처음 변경된 커밋부터 개정을 변경합니다. 이것은 분기 사전 재작성에 기반한 변경 사항을 기반으로 하는 모든 사람에게 문제가 있음을 의미합니다.

회복

다른 개발자가 재작성 전 버전을 기반으로 하지 않은 경우 가장 간단한 솔루션은 다시 복제(다시 복제)하는 것입니다.

git rebase --pull 시도할 수 있습니다. 이 기능은 저장소에 변경 사항이 없는 경우 빨리 감거나 재작성된 커밋 위에 분기를 리베이스합니다. comits를 영원히 다시 작성하십시오). 이 모든 것은 그들이 일을 하지 않았다는 가정하에 이루어집니다. 그렇지 않으면 변경 사항을 숨기 git stash 를 사용하십시오.

다른 개발자가 기능 분기를 사용하거나 git pull --rebase 가 작동하지 않는 경우(예: 업스트림이 설정되지 않았기 때문에) 재작성 후 커밋 위에 작업 을 리베이스해야 합니다. 예를 들어 새 변경 사항을 git fetch ), origin/master master 분기의 경우 다음을 실행해야 합니다.

 $ git rebase --onto origin/master origin/master@{1} master

여기서 origin/master@{1} 는 재작성 전 상태(가져오기 전)입니다. gitrevisions를 참조하십시오.


대체 솔루션은 버전 1.6.5부터 Git에서 사용할 수 있는 refs/replace/ 메커니즘을 사용하는 것입니다. 이 솔루션에서는 잘못된 이메일이 포함된 커밋을 대체합니다. 다음 심판 '대체'페치 사람 (같은 뭔가 fetch = +refs/replace/*:refs/replace/* 적절한 장소에 refspec을 자신의 .git/config ) 그 심판을 가져 오지 않는 투명하게 교체하고, 사람들을 얻을 것 것 오래된 커밋을 참조하십시오.

절차는 다음과 같습니다.

  1. 예를 들어 다음을 사용하여 잘못된 이메일로 모든 커밋을 찾습니다.

     $ git log --author=user@wrong.email --all
  2. 각각의 잘못된 커밋에 대해 대체 커밋을 만들고 개체 데이터베이스에 추가합니다.

     $ git cat-file -p <ID of wrong commit> | sed -e 's/user@wrong\.email/user@example.com/g' > tmp.txt $ git hash-object -t commit -w tmp.txt <ID of corrected commit>
  3. git replace 명령을 사용하여 잘못된 커밋을 수정한 커밋으로 자동으로 투명하게 바꾸도록 git에 지시해야 합니다.

     $ git replace <ID of wrong commit> <ID of corrected commit>
  4. 마지막으로 모든 교체를 나열하여 이 절차가 성공했는지 확인합니다.

     $ git replace -l

    교체가 발생하는지 확인하십시오.

     $ git log --author=user@wrong.email --all

물론 이 절차를 자동화할 수 있습니다... 글쎄, git replace 를 사용하는 것을 제외하고는 모두 이를 위해 쉘 루프를 사용하거나 "수동으로" 교체해야 합니다.

검증되지 않은! YMMV.

refs/replace/ 메커니즘을 사용할 때 약간의 거친 모서리를 만날 수 있다는 점에 유의하십시오. 새 기능이고 아직 잘 테스트되지 않았습니다 .


Jakub Narębski

git은 두 개의 다른 이메일 주소를 저장하는데, 하나는 커미터 (변경을 커밋한 사람)를 위한 것이고 다른 하나는 작성자 (변경을 작성한 사람)를 위한 것입니다.

커미터 정보는 대부분의 위치에 표시되지 않지만 git log -1 --format=%cn,%ce show 있습니다(또는 특정 커밋을 지정하려면 log 대신 show를 사용).

마지막 커밋의 작성자를 변경하는 것은 git commit --amend --author "Author Name <email@example.com>" 만큼 간단하지만 커미터 정보에 동일한 작업을 수행하는 한 줄짜리 또는 인수는 없습니다.

해결책은 (일시적으로든 아니든) 사용자 정보를 변경한 다음 커밋을 수정하여 커미터를 현재 정보로 업데이트하는 것입니다.

 git config user.email my_other_email@example.com git commit --amend

Sir Athos

수정하려는 커밋이 최신 커밋이고 그 중 몇 git resetgit stash 를 함께 사용하여 커밋을 다시 되돌릴 수 있습니다.

순서는 다음과 같습니다(2개의 잘못된 커밋, 보류 중인 변경 사항 없음).

 git config user.name <good name> git config user.email <good email> git reset HEAD^ git stash git reset HEAD^ git commit -a git stash pop git commit -a

djromero

EGit과 함께 Eclipse를 사용하는 경우 아주 쉬운 솔루션이 있습니다.
가정: 잘못된 사용자 때문에 원격 분기 '마스터'로 푸시할 수 없는 로컬 분기 'local_master_user_x'에 커밋이 있습니다.

  1. 원격 브랜치 '마스터' 체크아웃
  2. 'local_master_user_x'에 변경 사항이 포함된 프로젝트/폴더/파일을 선택하십시오.
  3. 마우스 오른쪽 버튼 클릭 - 다음으로 대체 - 분기 - 'local_master_user_x'
  4. 이 변경 사항을 다시 커밋합니다. 이번에는 올바른 사용자로 로컬 분기 '마스터'에 커밋합니다.
  5. 원격 '마스터'로 푸시

paphko

대화식 rebase를 사용하여 변경하려는 각 커밋 후에 수정 명령을 배치할 수 있습니다. 예를 들어:

 pick a07cb86 Project tile template with full details and styling x git commit --amend --reset-author -Chead

j16r

오늘 작성자 이름의 UTF8 문자로 인해 빌드 서버에 문제가 발생하는 문제가 발생하여 이를 수정하기 위해 기록을 다시 작성해야 했습니다. 취한 조치는 다음과 같습니다.

1단계: https://help.github.com/articles/setting-your-username-in-git/의 지침에 따라 향후 모든 커밋에 대해 git에서 사용자 이름을 변경합니다.

2단계: 다음 bash 스크립트를 실행합니다.

 #!/bin/sh REPO_URL=ssh://path/to/your.git REPO_DIR=rewrite.tmp # Clone the repository git clone ${REPO_URL} ${REPO_DIR} # Change to the cloned repository cd ${REPO_DIR} # Checkout all the remote branches as local tracking branches git branch --list -r origin/* | cut -c10- | xargs -n1 git checkout # Rewrite the history, use a system that will preseve the eol (or lack of in commit messages) - preferably Linux not OSX git filter-branch --env-filter ' OLD_EMAIL="me@something.com" CORRECT_NAME="New Me" if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ] then export GIT_COMMITTER_NAME="$CORRECT_NAME" fi if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ] then export GIT_AUTHOR_NAME="$CORRECT_NAME" fi ' --tag-name-filter cat -- --branches --tags # Force push the rewritten branches + tags to the remote git push -f # Remove all knowledge that we did something rm -rf ${REPO_DIR} # Tell your colleagues to `git pull --rebase` on all their local remote tracking branches

빠른 개요: 저장소를 임시 파일로 체크아웃하고, 모든 원격 분기를 체크아웃하고, 기록을 다시 작성하는 스크립트를 실행하고, 새 상태를 강제로 푸시하고, 모든 동료에게 변경 사항을 가져오기 위해 리베이스 풀을 수행하도록 지시합니다.

커밋 메시지의 줄 끝을 어지럽혀서 OS X에서 실행하는 데 문제가 있었습니다. 그래서 나중에 Linux 시스템에서 다시 실행해야 했습니다.


Miloš Ranđelović

당신의 문제는 정말 일반적입니다. "메일맵을 사용하여 Git의 작성자 목록 수정 "을 참조하십시오.

단순화를 위해 프로세스를 쉽게 하는 스크립트를 만들었습니다. git-changemail

해당 스크립트를 경로에 넣은 후 다음과 같은 명령을 실행할 수 있습니다.

  • 현재 분기에서 작성자 일치 변경

     $ git changemail -a old@email.com -n newname -m new@email.com
  • <branch> 및 <branch2>에서 작성자 및 커미터 일치를 변경합니다. 백업을 다시 쓸 수 있도록 필터 분기에 -f

     $ git changemail -b old@email.com -n newname -m new@email.com -- -f &lt;branch> &lt;branch2>
  • 저장소에 기존 사용자 표시

     $ git changemail --show-both

그건 그렇고, 변경 사항을 적용한 후 git-backup-clean을 사용하여 필터 분기에서 백업을 정리하십시오.


albfan

내 예제도 추가하고 싶습니다. 주어진 매개변수 로 bash_function을 만들고 싶습니다.

이것은 mint-linux-17.3에서 작동합니다.

 # $1 => email to change, $2 => new_name, $3 => new E-Mail function git_change_user_config_for_commit { # defaults WRONG_EMAIL=${1:-"you_wrong_mail@hello.world"} NEW_NAME=${2:-"your name"} NEW_EMAIL=${3:-"new_mail@hello.world"} git filter-branch -f --env-filter " if [ \$GIT_COMMITTER_EMAIL = '$WRONG_EMAIL' ]; then export GIT_COMMITTER_NAME='$NEW_NAME' export GIT_COMMITTER_EMAIL='$NEW_EMAIL' fi if [ \$GIT_AUTHOR_EMAIL = '$WRONG_EMAIL' ]; then export GIT_AUTHOR_NAME='$NEW_NAME' export GIT_AUTHOR_EMAIL='$NEW_EMAIL' fi " --tag-name-filter cat -- --branches --tags; }

stephanfriedrich

이것을 시도하십시오. 위에서 언급한 것과 동일하지만 대화식으로 수행됩니다.

 bash <(curl -s https://raw.githubusercontent.com/majdarbash/git-author-change-script/master/run.sh)

참조: https://github.com/majdarbash/git-author-change-script


Majd Arbash

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

반응형