it-swarm-korea.com

잘못된 이메일 주소 / 이름을 수정하기 위해 git의 기록을 편집하는 방법

Git을 사용하기 시작했을 때 방금 git init 님과 add 님과 commit 님에게 전화를 시작했습니다. 이제주의를 기울이고 있으며 커밋이 [email protected], 내가 원하는 주소가 아닙니다. 마치 GIT_AUTHOR_EMAILGIT_COMMITTER_EMAIL는 내가 원하는 것을 수행하지만 여전히 잘못된 전자 메일 주소/이름을 가진 오래된 커밋이 있습니다. 이전 커밋을 어떻게 수정할 수 있습니까?

76
Chas. Owens

Git filter-branch를 한 번만 호출하면 모든 커밋을 되돌릴 수 있습니다. 이것은 rebase와 같은 효과가 있지만 각 커밋을 개별적으로 수정하는 대신 모든 히스토리를 수정하기 위해 하나의 명령 만 수행하면됩니다.

이 명령으로 모든 잘못된 이메일을 수정할 수 있습니다.

git filter-branch --env-filter '
    oldname="(old name)"
    oldemail="(old email)"
    newname="(new name)"
    newemail="(new email)"
    [ "$GIT_AUTHOR_EMAIL"="$oldemail" ] && GIT_AUTHOR_EMAIL="$newemail"
    [ "$GIT_COMMITTER_EMAIL"="$oldemail" ] && GIT_COMMITTER_EMAIL="$newemail"
    [ "$GIT_AUTHOR_NAME"="$oldname" ] && GIT_AUTHOR_NAME="$newname"
    [ "$GIT_COMMITTER_NAME"="$oldname" ] && GIT_COMMITTER_NAME="$newname"
    ' HEAD

자세한 내용은 git docs

82
andy

Git의 filter-branch 명령은 강력하지만 수정해야 할 작성자가 두 명 이상인 경우와 같이 사소한 것이 아닌 경우에는 사용하기가 끔찍합니다.

다음은 git-shortlog 맨 페이지에 설명 된 .mailmap 기능을 사용하는 유용한 대안입니다. 이것은 git log의 형식화 기능과 함께 사용할 수있는 작성자 매핑 메커니즘을 제공합니다. 이름 지정된 커밋 시퀀스를 선택하고 수정하는 명령을 생성하는 데 사용할 수 있습니다.

예를 들어, $ START 커밋에서 시작하여 브랜치 $ BRANCH의 저작권을 수정한다고 가정하십시오.

기존 작성자 이름을 올바른 저자 이름으로 맵핑하는 저장소의 최상위 디렉토리에 .mailmap 파일을 작성해야합니다. 다음을 사용하여 기존 작성자 이름 목록을 얻을 수 있습니다.

git shortlog -se

다음과 같은 .mailmap 파일로 끝나야합니다 (예 :).

You <[email protected]>   [email protected]
You <[email protected]>   [email protected]

이제 git log의 형식화 기능을 사용하여 $ BRANCH를 $ BRANCH2로 다시 쓰는 명령을 생성 할 수 있습니다.

git checkout -b $BRANCH2 $START
git log --reverse --pretty=format:"cherry-pick %H; commit --amend --author='%aN <%aE>' -C %H" $START..$BRANCH | sh - 

첫 번째 명령은 커밋 $ START에서 새 빈 분기 싹을 만듭니다. $ START와 $ BRANCH 사이의 각 커밋에 대해 두 번째 명령 cherry는 현재 분기 $ BRANCH2의 끝에서 원래 커밋을 선택하고 작성자를 올바르게 설정하도록 수정합니다.

이것은 또한 일반적으로 적용 가능합니다-~/.gitconfig에 넣으십시오.

[alias]
    # git reauthor $START..$END
    reauthor = !sh -c 'eval `git log --reverse --topo-order --pretty=format:\"git cherry-pick %H &&  git commit --amend -C %H --author=\\\"%aN <%aE>\\\" && \" $0 ` "echo success" '

따라서 작성자를 수정해야하는 경우 이제 .mapfile을 생성하고 다음을 수행해야합니다.

git checkout -b $BRANCH2 $START
git reauthor $START..$BRANCH

원래 브랜치 참조를 새 브랜치로 재 할당하고 새 브랜치 참조를 삭제할 수 있습니다.

git checkout $BRANCH
git reset --hard $BRANCH2 # be careful with this command
git branch -d $BRANCH2
28
wu-lee

git의 첫 번째 커밋에서 메타 정보를 수정하려면 어떻게해야합니까?

### Fix the first commit ###    
# create a temporary tag for the root-most commit so we can reference it
git tag root `git rev-list HEAD | tail -1`
# check it out on its own temporary branch
git checkout -b new-root root
# amend the commit
git commit --amend --author "Foo [email protected]"
# (or if you've set the proper git **config** values)
git commit --amend -C HEAD --reset-author
# now you've changed the commit message, so checkout the original branch again
git checkout @{-1}
# and rebase it onto your new root commit
git rebase --onto new-root root
### Fix the rest of the commits ###
git rebase -i root
# edit the file to read "edit <commit number> for each entry
# amend the commit
git commit --amend --author "Foo [email protected]"
# (or if you've set the proper git **config** values)
git commit --amend -C HEAD --reset-author
# move to the next commit
git rebase --continue    
# continue running the last two commands until you see
# Successfully rebased and updated refs/heads/master.
### Clean up ###
# nuke the temporary branch we created
git branch -d new-root
# nuke the temporary tag we created
git tag -d root
9
Chas. Owens

Jedberg의 답변을 따르려면 : rebase -i하고 해당 커밋을 수정합니다. git commit --amend --author <AUTHOR DETAILS> 그리고 git rebase continue 당신은 가서 역사를 고칠 수 있습니다.

5
Chealion