it-swarm.dev

Git에서 작성자와 커미터 이름 및 다중 커밋의 전자 메일을 변경하는 방법?

저는 학교 컴퓨터에 간단한 스크립트를 작성하고 Git에 변경 사항을 적용했습니다 (내 컴퓨터에서 복제 된 내 pendrive에있는 저장소에 있음). 여러 번 커밋 한 후 루트 사용자로 작업을하고 있음을 깨달았습니다.

이 커밋의 저자를 내 이름으로 변경하는 방법이 있습니까?

2165
Flávio Amieiro

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

특히,이 명령을 사용하여 잘못된 모든 저자 이름과 이메일을 모든 브랜치 및 태그에 대해 수정할 수 있습니다 (출처 : GitHub help ) :

#!/bin/sh

git filter-branch --env-filter '
OLD_EMAIL="[email protected]"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="[email protected]"
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
1041
Pat Notz

대화 형 Rebase 사용

너 할 수있어.

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

그런 다음 모든 나쁜 커밋을 rebase 파일에서 "편집"으로 표시하십시오. 또한 첫 번째 커밋을 변경하려면 rebase 파일의 첫 번째 줄에 수동으로 추가해야합니다 (다른 줄의 형식을 따르십시오). 그런 다음 git이 각 커밋을 수정하라는 메시지를 표시하면

 git commit --amend --author "New Author Name <[email protected]>" 

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

git rebase --continue

rebase를 계속하십시오.

--no-edit를 추가하여 편집기를 열지 않아도 명령을 실행할 수 있습니다.

git commit --amend --author "New Author Name <[email protected]>" --no-edit && \
git rebase --continue

단일 커밋

일부 주석가들이 지적했듯이 가장 최근의 커밋을 변경하기를 원한다면 rebase 명령은 필요하지 않습니다. 그냥 해

 git commit --amend --author "New Author Name <[email protected]>"

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

 git -c user.name="New Author Name" -c [email protected] commit --amend --reset-author

병합 커밋에 대한 참고 사항

원래 응답에 약간의 결함이있었습니다. 현재 HEAD<some HEAD before all your bad commits> 사이에 병합 커밋이있는 경우 git rebase가 병합됩니다 (그런데 GitHub 끌어 오기 요청을 사용하면 병합 커밋 수만). 이것은 매우 다른 역사로 이어질 수 있습니다 (중복 변경은 "리베이스 아웃"될 수 있습니다). 최악의 경우 git rebase로 이어질 수 있습니다 (병합 커밋에서 이미 해결되었을 가능성이있는) 어려운 병합 충돌을 해결하도록 요청할 수 있습니다. . 해결 방법은 -pgit rebase 플래그를 사용하여 기록의 병합 구조를 보존하는 것입니다. git rebase에 대한 맨 페이지는 -p-i를 사용하면 문제가 발생할 수 있다고 경고하지만 BUGS 섹션에는 "커밋 편집 및 커밋 메시지의 수정은 정상적으로 작동합니다."라는 경고 메시지가 표시됩니다.

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

1487
asmeurer

다음과 같이 할 수도 있습니다.

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 "[email protected]";
        else
                git commit-tree "[email protected]";
        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 "[email protected]";
        else
                git commit-tree "[email protected]";
        fi" HEAD
577
Rognon

라이너 하나이지만 다중 사용자 저장소가 있으면주의해야합니다. all 변경하여 동일한 (새로운) 작성자와 커미터를 갖도록합니다.

git filter-branch -f --env-filter "GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='[email protected]'; GIT_COMMITTER_NAME='Newname'; GIT_COMMITTER_EMAIL='[email protected]';" HEAD

문자열에 줄 바꿈이있는 경우 (bash에서 가능) :

git filter-branch -f --env-filter "
    GIT_AUTHOR_NAME='Newname'
    GIT_AUTHOR_EMAIL='[email protected]'
    GIT_COMMITTER_NAME='Newname'
    GIT_COMMITTER_EMAIL='[email protected]'
  " HEAD
512
Brian Gianforcaro

$ HOME/.gitconfig가 초기화되지 않은 경우에 발생합니다. 이 문제를 해결할 수 있습니다 :

git config --global user.name "you name"
git config --global user.email [email protected]
git commit --amend --reset-author

자식 버전 1.7.5.4로 테스트

212
lrkwz

단일 커밋의 경우 :

git commit --amend --author="Author Name <[email protected]>"

(회답 자의 답변에서 추출)

181
blueyed

상위 수의 커밋이 나쁜 작성자가있는 경우 다음과 같이 exec 명령과 git rebase -i 커밋을 사용하여 --amend 내부에서이 작업을 모두 수행 할 수 있습니다.

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 protected]>" -C HEAD
pick 1234 my bad commit 2
exec git commit --amend --author="New Author Name <[email protected]>" -C HEAD

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

이 솔루션은 다른 어떤 것보다 입력하는 시간이 더 오래 걸릴 수 있지만 고도로 제어 가능합니다. 정확히 무엇이 커밋되는지 알고 있습니다.

영감을 얻은 @asmeurer에게 감사드립니다.

166
Alex Brown

Github에는 Nice solution 이 있으며, 다음 쉘 스크립트입니다.

#!/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" = "[email protected]" ]
then
    cn="Your New Committer Name"
    cm="Your New Committer Email"
fi
if [ "$GIT_AUTHOR_EMAIL" = "[email protected]" ]
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"
'
108
Olivier Verdier

Docgnome 언급 한 바와 같이, 역사를 재작 성하는 것은 위험하고 다른 사람들의 저장소를 깰 것입니다.

그러나 정말로하고 싶다면 bash 환경에 있어야한다. (리눅스에서는 아무런 문제가없고 Windows에서는 git의 설치와 함께 제공되는 git bash를 사용할 수있다.) git filter-branch :를 사용하면된다.

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

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

git filter-branch --env-filter '
  if [ $GIT_AUTHOR_EMAIL = [email protected] ];
    then [email protected];
  fi;
export GIT_AUTHOR_EMAIL' HEAD~20..HEAD
80
svick

다른 작성자로부터 병합되지 않은 커밋을 인계 받으면 쉽게 처리 할 수 ​​있습니다.

git commit --amend --reset-author

47
Ryanmt

이를 별칭 로 사용하면 다음과 같이 할 수 있습니다.

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

마지막 10 커밋 :

git change-commits GIT_AUTHOR_EMAIL "[email protected]" "[email protected]" 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\" [email protected]; }; f "

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

희망은 유용합니다.

40
brauliobo

이것은 좀 더 정교한 @ 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을 사용하는 것입니다. 즉, 현재 분기 에있는 모든 수정 내용을 필터링하는 것을 의미합니다. 그리고 재 작성된 브랜치에는 태그 (또는 다른 참조)가 존재하지 않습니다.

38
stigkj
  1. git rebase -i <sha1 or ref of starting point>를 실행하십시오.
  2. edit (또는 e)을 사용하여 변경하려는 모든 커밋을 표시합니다.
  3. 모든 커밋을 처리 할 때까지 다음 두 명령을 반복하십시오.

    git commit --amend --reuse-message=HEAD --author="New Author <[email protected]>"; git rebase --continue

이것은 다른 모든 커밋 정보 (날짜 포함)를 유지합니다. --reuse-message=HEAD 옵션을 사용하면 메시지 편집기가 시작되지 않습니다.

23
sporsh

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

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

그런 다음 filter-branch의 MAN 페이지 에 설명 된대로 filter-branch에 의해 백업 된 모든 원본 참조를 제거하십시오 (이것은 파괴적이며 백업입니다).

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

나는이 해결책을 채택했다. 는 간단한 author-conv-file (형식은 git-cvsimport 와 동일하다)를 사용하여 작동한다. 모든 지점에서 author-conv-file에 정의 된대로 모든 사용자를 변경하여 작동합니다.

우리는 이것을 cvs2git와 함께 사용하여 저장소를 cvs에서 git으로 마이그레이션했습니다.

즉, 샘플 author-conv-file

john=John Doe <[email protected]>
jill=Jill Doe <[email protected]>

스크립트 :

 #!/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
20
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="<[email protected]>";
fi
if [ "$GIT_COMMITTER_NAME" = "<old committer>" ];
then
    GIT_COMMITTER_NAME="<new commiter>";
    GIT_COMMITTER_EMAIL="<[email protected]>";
fi
' -- --all
18
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 <[email protected]>" # 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 <[email protected]>"  # change the author name & email
    
    # Save changes and exit the editor
    
    $ git rebase --continue                # finish the rebase
    
17
Sajib Khan

유일한 문제는 작성자/이메일이 평소와 다르다는 것입니다. 문제는 아닙니다. 올바른 수정은 .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 을 참조하십시오.

여기에는 다른 모든 솔루션의 이점이 있습니다. 즉, 기록을 다시 쓸 필요가 없으며 업스트림이있는 경우 문제가 발생할 수 있으며 실수로 데이터를 잃을 수있는 좋은 방법입니다.

물론, 자신이 뭔가를 저 지르고 실제로 누군가 다른 사람이되어야하고이 시점에서 기록을 다시 쓰는 것을 싫어한다면 커밋 작성자를 변경하는 것이 기여 목적을위한 좋은 아이디어 일 수 있습니다 (이 경우 사용자를 내 다른 답변은 여기).

15
asmeurer

이 저장소의 유일한 사용자 인 경우 git filter-branch 를 사용하여 기록을 다시 작성할 수 있습니다 svick 썼다 ) 또는 git fast-export / git fast-import 필터 스크립트 플러스 ( docgnome에서 참조 된 기사에 설명 된대로) answer ) 또는 대화식 rebase . 그러나 그 중 하나는 처음 변경된 커밋부터 개정을 변경합니다. 이는 브랜치 사전 다시 쓰기에 대한 변경 내용을 기반으로하는 모든 사람에게 문제가 있음을 의미합니다.

회복

다른 개발자가 사전 재 작성 버전을 기반으로하지 않은 경우 가장 간단한 해결책은 다시 복제하는 것입니다.

또는 리포지토리에 변경 사항이없는 경우 빨리 감거나 _git rebase --pull_를 시도하거나 다시 작성된 커밋 위에 분기를 리베이스 할 수 있습니다 (우리는 병합을 피하려고합니다. 다시 쓴다). 이 모든 것은 그들이 일을하지 않았다고 가정하고; 그렇지 않으면 _git stash_를 사용하여 변경 사항을 숨기십시오.

다른 개발자가 기능 분기를 사용하거나 _git pull --rebase_가 작동하지 않는 경우 업스트림이 설정되어 있지 않기 때문에 포스트-쓰기 후 커밋 위에서 rebase 작업을 수행해야합니다. 예를 들어 _git fetch_에서 시작하거나 분기 된 master 분기에 대해 새 변경 사항 (_Origin/master_)을 가져온 직후 실행해야합니다.

_$ git rebase --onto Origin/master Origin/[email protected]{1} master
_

여기서 _Origin/[email protected]{1}_는 다시 쓰기 전 상태 (페치 전)입니다. gitrevisions 를 참조하십시오.


대체 솔루션은 버전 1.6.5부터 Git에서 사용 가능한 refs/replace/ 메커니즘을 사용하는 것입니다. 이 솔루션에서는 잘못된 이메일을 가진 커밋을 대체 할 수 있습니다. 그런 다음 '대체'참조를 가져 오는 사람 ( the ( _fetch = +refs/replace/*:refs/replace/*_의 적절한 위치에 _.git/config_ refspec과 같은)은 투명하게 대체되고 그렇지 않은 사람들은 대체를 얻습니다. 그 심판을 가져 오면 오래된 커밋을 볼 수 있습니다.

절차는 다음과 같습니다.

  1. 잘못된 이메일로 커밋 찾기 (예 :

    _$ git log [email protected] --all
    _
  2. 각각의 잘못된 커밋에 대해 대체 커밋을 생성하여 객체 데이터베이스에 추가

    _$ git cat-file -p <ID of wrong commit> | 
      sed -e 's/[email protected]\.email/[email protected]/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 [email protected] --all
    _

물론이 절차를 자동화 할 수 있습니다. (아직) 배치 모드가없는 _git replace_을 사용하는 것을 제외하고는 모두 그렇기 때문에 셸 루프를 사용하거나 "수동으로"교체해야합니다.

테스트되지 않았습니다! YMMV.

_refs/replace/_ 메커니즘을 사용할 때 약간의 구석이 생길 수 있습니다. 새롭지 만 아직 잘 테스트되지 않았습니다..

9
Jakub Narębski

마지막 N 커밋의 작성자를 변경하려고한다고 가정합니다.

git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <[email protected]>' --no-edit"

노트

  • --no-edit 플래그는 git commit --amend가 추가 확인을 요청하지 않는지 확인합니다
  • git rebase -i를 사용할 때 작성자를 변경할 위치를 수동으로 선택할 수 있습니다.

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

pick 897fe9e simplify code a little
exec git commit --amend --author 'Author Name <[email protected]>' --no-edit
pick abb60f9 add new feature
exec git commit --amend --author 'Author Name <[email protected]>' --no-edit
pick dc18f70 bugfix
exec git commit --amend --author 'Author Name <[email protected]>' --no-edit

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

7
Chris Maes

수정하려는 커밋이 최신 커밋이고 그 중 몇 가지 만 있으면 올바른 이름과 전자 메일을 구성한 후 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
6
djromero

당신의 문제는 정말로 흔합니다. " Git에서 작성자 목록을 수정하기 위해 메일 맵 사용하기 "

간단히하기 위해 프로세스를 쉽게하기위한 스크립트를 만들었습니다 : git-changemail

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

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

    $ git changemail -a [email protected] -n newname -m [email protected]
    
  • <branch>와 <branch2>에서 작성자와 커미터 일치를 변경하십시오. 백업 다시 쓰기를 허용하려면 -f를 filter-branch로 전달하십시오.

    $ git changemail -b [email protected] -n newname -m [email protected] -- -f &lt;branch> &lt;branch2>
    
  • 기존 사용자를 repo에 표시

    $ git changemail --show-both
    

그건 그렇고, 변경 한 후 filter-branch에서 다음과 같이 백업을 정리하십시오 : git-backup-clean

5
albfan

저자 이름의 UTF8 문자가 빌드 서버에 문제를 일으키는 문제가 발생하여이를 수정하기 위해 히스토리를 다시 작성해야했습니다. 수행 된 단계는 다음과 같습니다.

1 단계 : 앞으로의 모든 커밋에 대해 git에서 사용자 이름을 다음 지침에 따라 변경하십시오. https://help.github.com/articles/setting-your-username-in-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="[email protected]"
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

빠른 개요 : 저장소를 임시 파일로 체크 아웃하고, 모든 원격 지점을 체크 아웃하고, 기록을 다시 쓰는 스크립트를 실행하고, 강제로 새 상태를 밀어 넣고, 모든 동료에게 rebase pull을 수행하여 변경 사항을 적용하도록합니다.

우리는 OS X에서 이것을 실행하는 데 어려움을 겪었습니다. 왜냐하면 커밋 메시지에서 줄 끝 부분을 엉망으로 만들었 기 때문에 나중에 Linux 컴퓨터에서 다시 실행해야했습니다.

5
Miloš Ranđelović

Git store two 다른 전자 메일 주소, committer (변경을 위임 한 사람) 및 author (다른 사람이 작성한 사람 변화).

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

마지막 커밋의 작성자를 변경하는 것은 git commit --amend --author "Author Name <[email protected]>"만큼 간단하지만, 커미터 정보에도 동일한 라이너 또는 인수가 없습니다.

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

git config user.email [email protected] 
git commit --amend
5
Sir Athos

대화식 rebase를 사용하면 변경할 커밋마다 amend 명령을 배치 할 수 있습니다. 예를 들면 :

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

Eclipse를 EGit과 함께 사용한다면 매우 쉬운 해결책이 있습니다.
가정 : 유효하지 않은 사용자로 인해 'master_'원격 지점으로 푸시 될 수없는 로컬 지점 'local_master_user_x'에 커밋이 있습니다.

  1. 원격 지점 'master'를 체크 아웃하십시오.
  2. 'local_master_user_x'에 변경 사항이 포함 된 프로젝트/폴더/파일을 선택하십시오.
  3. 마우스 오른쪽 버튼 - 바꾸기 - 분기 - 'local_master_user_x'
  4. 이 변경 사항을 올바른 사용자로 다시 보내고 'master'로컬 브랜치에 다시 적용하십시오.
  5. 원격 '마스터'로 푸시
5
paphko

이것을하기위한 가장 빠르고 쉬운 방법은 git rebase의 --exec 인자를 사용하는 것입니다 :

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

이렇게하면 다음과 같은 todo-list가 생성됩니다 :

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
...

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

4
Lie Ryan

이 저장소의 유일한 사용자이거나 다른 사용자의 저장소를 손상시킬 우려가 없다면 예. 이러한 커밋을 푸시했는데 다른 사람이 액세스 할 수있는 위치에 존재하면 다른 사람의 repos를 깨뜨리는 것에 신경 쓰지 않는 한 아니요. 문제는 이러한 커밋을 변경하여 새로운 SHA를 생성하여 다른 커밋으로 처리되도록하는 것입니다. 다른 누군가가 이러한 변경된 커밋을 끌어들이려고 할 때, 역사는 다르며 kaboom입니다.

이 페이지 http://inputvalidation.blogspot.com/2008/08/how-to-change-git-commit-author.html 방법을 설명합니다. (나는 이것을 시도하지 않았다 그래서 YMMV)

2
baudtack

내 예제도 추가하고 싶다. 주어진 매개 변수로 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:-"[email protected]"}
 NEW_NAME=${2:-"your name"}
 NEW_EMAIL=${3:-"[email protected]"}

 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;
}
2
stephanfriedrich

이것을 시험해보십시오. 위에서 언급 한 것과 동일하지만 대화식으로 작동합니다.

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

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

1
Majd Arbash
git rebase -i YOUR_FIRTS_COMMIT_SHA^

while true; do git commit --amend --author="Name Surname <[email protected]>" --no-edit && git rebase --continue; done

Rebase가 완료된 후 ^ C #을 누르십시오 (루프는 마지막 커밋을 계속 업데이트합니다)

0
Vojtech Vitek