GIT의 여러 커밋의 저자 및 커미터 이름과 전자 메일을 변경하는 방법은 무엇입니까?
질문
나는 학교 컴퓨터에 간단한 스크립트를 작성하고, Git의 변경 사항을 저지른 (내 펜 드라이브에있는 Repo에서 집에서 컴퓨터에서 복제)되었습니다.몇 가지 커밋 후, 나는 루트 사용자로서 물건을 저지른 것을 깨달았습니다.
이 커밋의 저자를 제 이름으로 바꿀 수있는 방법이 있습니까?
답변
참고 :이 답변은 SHA1S를 변경하므로 이미 푸시 된 지점에서 사용할 때주의하십시오.이름의 맞춤법을 수정하거나 이전 이메일을 업데이트하려는 경우 .mailmap을 사용하여 기록을 다시 작성하지 않고이 작업을 수행 할 수 있습니다.내 다른 대답을 보아라.
Rebase를 사용하여
첫째, 아직 수행하지 않은 경우 git-config에서 이름을 수정하려는 것 같습니다.
git config --global user.name "New Author Name"
git config --global user.email "<email@address.com>"
이는 선택 사항이지만, 이렇게하면 커미터 이름을 재설정해야합니다.
리베이스를 사용하여 범위 범위의 범위에 대한 메타 데이터를 다시 작성하려면
git rebase -r <some commit before all of your bad commits> \
--exec 'git commit --amend --no-edit --reset-author'
- exec은 각 커밋이 다시 작성된 후 Git 커밋 단계를 실행합니다 (마치 Git Commit && Git Rebase - 반복적으로 rebase --continue).
첫 번째 커밋 ( '루트'커밋이라고도 함)을 변경하려면 리베이스 호출에 --root를 추가해야합니다.
이렇게하면 committer.name/User.Email 구성에 대한 커미터와 작성자가 모두 변경됩니다.해당 구성을 변경하지 않으려면 --reset-japer 대신 --Author "New Author Name
단일 커밋
가장 최근의 커밋을 변경하고 싶다면 리베이 효소가 필요하지 않습니다.그냥 커밋을 수정하십시오 :
git commit --amend --no-edit --reset-author
이전 GIT 고객의 경우 (7 월 2020 일)
-r, - Rebase-merges가 당신을 위해 존재하지 않을 수 있습니다.대체품으로, 당신은 -p을 사용할 수 있습니다.-p는 심각한 문제가 있으며 이제는 더 이상 사용되지 않습니다.
답변
이 답변은 문서가이 경고를 제공하는 git-filter-branch를 사용합니다. Git Filter-Branch는 의도 된 역사 재 작성의 비 분리되지 않은 압착을 일으킬 수있는 플터 라를 가지고 있으며 그러한 심합 성능이 있으므로 그러한 문제를 조사하기 위해 거의 시간을 남길 수 있습니다.이러한 안전 및 성능 문제는 역소하게 고정 될 수 없으며 그 사용은 권장되지 않습니다.Git Filter-Repo와 같은 대체 이력 필터링 도구를 사용하십시오.여전히 Git Filter-Branch를 사용해야하는 경우 필터 분기의 랜드 광산에 대해 알아 보려면 안전 (및 성능)을 조심스럽게 읽으십시오.
저자 (또는 커미터)를 변경하려면 모든 기록을 다시 작성해야합니다.괜찮 으면 그 가치가 있다고 생각하면 Git Filter-Branch를 확인해야합니다.매뉴얼 페이지에는 시작하기위한 몇 가지 예제가 포함되어 있습니다.또한 사용자 환경 변수를 사용하여 작성자, 커미터, 날짜 등의 이름을 변경할 수 있습니다 - Git Manual 페이지의 "환경 변수"절을 참조하십시오.
특히이 명령을 사용하여 모든 분기 및 태그에 대한 모든 잘못된 작성자 이름과 전자 메일을 수정할 수 있습니다 (소스 : 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
대체 이력 필터링 도구 Git Filter-Repo를 사용하려면 먼저 GitMailMap 형식에 따라 Git-MailMap을 구성 할 수 있습니다.
Proper Name <proper@email.xx> Commit Name <commit@email.xx>
생성 된 메일 맵으로 필터 -po를 실행합니다.
git filter-repo --mailmap git-mailmap
답변
하나의 라이너가 있지만 다중 사용자 저장소가있는 경우 조심해야합니다. 이렇게하면 모든 커밋이 동일한 (새로운) 작성자 및 커미터를 갖도록 변경합니다.
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
문자열의 linebreaks (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
답변
당신은 또한 할 수 있습니다 :
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
참고, 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 "$@";
else
git commit-tree "$@";
fi" HEAD
답변
초기화 된 $ 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로 테스트되었습니다.
이것은 마지막 커밋 만 수정합니다.
답변
상위 소수의 커밋만이 나쁜 작가가있는 경우 다음과 같이 EXEC 명령과 - 계명 커밋을 사용하여 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 덕분에.
출처:https://stackoverflow.com/questions/750172/how-to-change-the-author-and-committer-name-and-e-mail-of-multiple-commits-in-gi
최근댓글