여러 커밋의 작성자 및 커밋 이름/이메일을 변경하려면 어떻게 해야 합니까?
커밋 범위의 작성자를 변경하려면 어떻게 해야 합니까?
메모: 이 답변은 SHA1을 변경하므로 이미 푸시된 분기에서 사용할 때는 주의하십시오.이메일을 을 다시 않고 Git을 사용할 수 ..mailmap
다른 답을 보세요.
기본 재배치 사용
먼저, 아직 git-config에서 이름을 수정하지 않았다면 git-config:
git config --global user.name "New Author Name"
git config --global user.email "<email@address.example>"
이것은 옵션입니다만, 커밋명이 필요한 것을 전제로 한 리셋도 실시합니다.
rebase를 사용하여 일련의 커밋 메타데이터를 다시 작성하려면
git rebase -r <some commit before all of your bad commits> \
--exec 'git commit --amend --no-edit --reset-author'
--exec
를 실행합니다.git commit
(「」를 실행한 와 같음)git commit && git rebase --continue
★★★★★★★★★★★★★★★★★★」
커밋(' 커밋도 함)도하려면 'root' 커밋을 추가해야 합니다.--root
기본 재설정 콜에 접속합니다.
하면 당신의 커밋으로 .user.name
/user.email
는, 「이 설정을 변경할 가 없는 경우」, 「이 설정을 변경할 수 없습니다.--author "New Author Name <email@address.example>"
--reset-author
커밋을 갱신하는 것은 아니고 작성자만 갱신하는 것에 주의해 주십시오.
단일 커밋
최신 커밋만 변경하는 경우 기본 재설정은 필요하지 않습니다.커밋을 수정하기만 하면 됩니다.
git commit --amend --no-edit --reset-author
전체 프로젝트 이력
git rebase -r --root --exec "git commit --amend --no-edit --reset-author"
오래된 Git 클라이언트용(2020년 7월 이전)
-r,--rebase-merges
존재하지 않을 수도 있습니다.「」를 사용할 수 .-p
해 주세요.-p
에 심각한 문제가 있어 현재는 사용되지 않습니다.
에서는 ""를 사용합니다.
git-filter-branch
이제 다음 경고가 표시됩니다.git filter-mails는 의도된 이력 개서를 위한 불필요한 망을 생성할 수 있는 수많은 함정을 가지고 있습니다(또한 이러한 문제를 조사할 시간이 거의 없습니다).이러한 안전 및 성능 문제는 하위 호환성으로 수정할 수 없으므로 사용을 권장하지 않습니다.git filter-repo 등의 대체 이력 필터링 툴을 사용해 주세요.그래도 git filter-branch를 사용해야 하는 경우 SAFETY(및 퍼포먼스)를 잘 읽고 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
대체 이력 필터링 툴 git filter-repo를 사용하기 위해 먼저 설치하고,git-mailmap
gitmailmap 포맷에 따라 주세요.
Proper Name <proper@email.xx> Commit Name <commit@email.xx>
그런 다음 작성된 메일 맵을 사용하여 filter-repo를 실행합니다.
git filter-repo --mailmap git-mailmap
라이너 1개만, 복수의 유저 저장소를 가지고 있는 경우는 주의해 주세요.이것에 의해, 모든 커밋이 같은(새로운) 작성자 및 커밋으로 변경됩니다.
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
다음 작업도 가능합니다.
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.example
git commit --amend --reset-author
Git 버전 1.7.5.4로 테스트 완료.
이로 인해 수정되는 것은 마지막 커밋뿐입니다.
몇 작성자가 , 이 을 위위 in in in 、 in in 、 in in 、 in in 、 。git rebase -i
exec
및 " " " 입니다.--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@address.example>" -C HEAD
pick 1234 my bad commit 2
exec git commit --amend --author="New Author Name <email@address.example>" -C HEAD
(실행할) 에디터를 저장하고 종료합니다.
이 솔루션은 다른 솔루션보다 입력하는 데 시간이 오래 걸릴 수 있지만 제어성이 매우 뛰어납니다. 어떤 커밋에 도달하는지 정확히 알고 있습니다.
영감을 주신 @asmeaker님 감사합니다.
단일 커밋의 경우:
git commit --amend --author="Author Name <email@address.example>"
(ASMEURER의 답변에서 제외)
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.example" ]
then
cn="Your New Committer Name"
cm="Your New Committer Email"
fi
if [ "$GIT_AUTHOR_EMAIL" = "your@email.to.match.example" ]
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"
'
마지막 N개의 작성자를 변경하는 단일 명령어는 다음과 같습니다.
git rebase -i HEAD~N -x "git commit --amend --author 'Author Name <author.name@mail.example>' --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.example>' --no-edit
pick abb60f9 add new feature
exec git commit --amend --author 'Author Name <author.name@mail.example>' --no-edit
pick dc18f70 bugfix
exec git commit --amend --author 'Author Name <author.name@mail.example>' --no-edit
그런 다음 일부 행을 수정하여 작성자를 변경할 위치를 볼 수 있습니다.이를 통해 자동화와 제어의 중간점을 찾을 수 있습니다. 실행 단계를 확인할 수 있습니다. 저장하면 모든 것이 한 번에 적용됩니다.
가 이미 ""로해 주십시오.git config user.name <your_name>
★★★★★★★★★★★★★★★★★」git config user.email <your_email>
하다
git rebase -i HEAD~N -x "git commit --amend --reset-author --no-edit"
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
작성자/이메일이 평소와는 다른 문제라면, 이것은 문제가 되지 않는다는 것을 지적합니다.은 '파일을 한다'라는 파일을 것입니다..mailmap
의 맨 에는, 이 붙어 있습니다.
Name you want <email you want> Name you don't want <email you don't want>
그 이후부터는 , 예를 들면 명령어, 예를 들면 명령어, 예를 들면 ,git shortlog
는, 이러한 2개의 이름을 같은 이름으로 간주합니다(특별히 지시하지 않는 한).상세한 것에 대하여는, https://schacon.github.io/git/git-shortlog.html 를 참조해 주세요.
이는 이력을 다시 쓸 필요가 없다는 점에서 여기 있는 다른 모든 솔루션과 같은 장점이 있습니다.업스트림에 있는 경우 문제가 발생할 수 있으며 항상 실수로 데이터를 손실하는 좋은 방법입니다.
물론, 만약 당신이 정말로 다른 사람이어야 하고, 이 시점에서 기록을 다시 쓰는 것을 꺼려하지 않는다면, 커밋 작성자를 변경하는 것은 아마도 귀책의 목적으로 좋은 생각일 것입니다(이 경우, 여기서 다른 답을 제시하겠습니다).
이를 에일리어스로 사용하여 다음 작업을 수행할 수 있습니다.
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/.http config
유용했으면 좋겠다.
다른 작성자로부터 병합되지 않은 커밋을 인계받는 경우 이를 쉽게 처리할 수 있는 방법이 있습니다.
git commit --amend --reset-author
작성자 및 커밋을 변경하려면 다음 작업을 수행합니다(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
다음의 몇개의 에러가 표시되는 일이 있습니다.
- 임시 디렉터리가 이미 있습니다.
- 참조/원본으로 시작하는 참조가 이미 있습니다.
(이는 저장소에서 다른 필터가 이미 실행되어 원래 브랜치 참조가 refs/original로 백업됨을 의미합니다.)
다음 오류에도 불구하고 실행을 강제하려면 플래그를 추가합니다.
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
대신 현재 브랜치에서만 모든 리비전을 필터링합니다.다시 작성된 브랜치에는 태그(또는 다른 참조)가 존재하지 않습니다.
하는 filter-branch
filter-repo
git docs가 제안하는 툴입니다.
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-repo
filter-branch
.
뒤의 commit-callback
옵션은 기본적으로 커밋 처리에 사용되는 python 코드입니다.여기에 파이썬으로 자신만의 논리를 쓸 수 있습니다. 것은, 「」을 참조해 주세요.commit
오브젝트 및 그 속성을 나타냅니다.
★★filter-repo
기트따라서 설치해야 합니다.
env >3 python env > = 3.5를 사용할 수 .pip
를 인스톨 합니다.
pip3 install git-filter-repo
주의: 꼭 시도해 보시기 바랍니다.filter-repo
새로운 클론에서 도구를 사용합니다.조작이 완료되면 리모트도 삭제됩니다.리모컨이 제거되는 이유에 대한 자세한 내용은 여기를 참조하십시오.또한 INTERNALS 섹션의 이 도구의 제한 사항도 읽어 보십시오.
려려를
git rebase -i <sha1 or ref of starting point>
를 붙입니다.
edit
(오류)e
)모든 커밋을 처리할 때까지 다음 2개의 명령어를 루프합니다.
git commit --amend --reuse-message=HEAD --author="New Author <new@author.email>"
git rebase --continue
그러면 다른 모든 커밋 정보(날짜 포함)가 유지됩니다.--reuse-message=HEAD
옵션을 지정하면 메시지 에디터가 시작되지 않습니다.
태그 및 모든 브랜치를 포함한 전체 저장소의 작성자를 다시 작성하려면 다음을 사용합니다.
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
나는 이 용액을 간단한 것을 섭취함으로써 적용했다.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
특히 다른 개발자의 패치를 커밋하면 기본적으로 코드를 도용하게 됩니다.
다음 버전은 모든 브랜치에서 동작하며 이를 방지하기 위해 작성자와 커미터를 개별적으로 변경합니다.
모든 옵션에 대해 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
커밋 " " "
author name & email
타타에Amend
를 치환하고, 을 치환합니다.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
방법으로
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
가장 빠르고 쉬운 방법은 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
...
이것은 자동적으로 동작해, 수백개의 커밋이 있는 경우에 동작합니다.
이 저장소의 유일한 사용자인 경우 (svick이 기술한 대로),git fast-import
/+ 필터 스크립트(docnome answer에서 언급된 문서에서 설명됨) 또는 대화형 기본 재배치 중 하나를 사용하여 이력을 다시 쓸 수 있습니다.그러나 어느 쪽이든 첫 번째 변경된 커밋 이후부터 리비전을 변경할 수 있습니다.이는 브런치 사전 리라이트를 기반으로 한 변경에 문제가 있음을 의미합니다.
복구
다른 개발자가 재작성 전 버전에 기반하지 않은 경우, 가장 간단한 해결책은 재클론(재클론)하는 것입니다.
에, 그들은 할 수 있습니다.git rebase --pull
이것은 저장소에 변경이 없는 경우 빠르게 전송하거나 다시 작성된 커밋 위에 브랜치를 재배치합니다(사전 커밋은 영원히 유지되므로 병합을 피하고 싶습니다). 것은 그들이 합니다; 을 합니다; 을 사용하세요.git stash
하다
브랜치를 사용하는 및 기능 브랜치를 사용하는 경우git pull --rebase
업스트림은 셋업되어 있지 않기 때문에 작업 기본을 변경 후 커밋 위에 다시 설정해야 합니다.예를 들어, 새로운 변경을 취득한 직후(git fetch
master
의거하다/origin/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/*
적절한 장소에서 재스펙을 하다 .git/config
또, 참조를 커밋을 참조해 주세요.는 트랜스페어런트하게 치환됩니다.이러한 참조를 취득하지 않은 사용자에게는 오래된 커밋이 표시됩니다.
순서는 다음과 같습니다.
잘못된 이메일이 있는 모든 커밋 검색(예:
$ git log --author=user@wrong.email --all
잘못된 커밋마다 대체 커밋을 생성하여 오브젝트 데이터베이스에 추가합니다.
$ 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>
오브젝트 데이터베이스에서 커밋을 수정했으므로 다음 명령을 사용하여 잘못된 커밋을 수정한 커밋으로 자동적이고 투명하게 대체하도록 git에게 지시해야 합니다.
$ git replace <ID of wrong commit> <ID of corrected commit>
마지막으로, 이 절차가 성공했는지 확인하기 위해 모든 교환품을 나열합니다.
$ git replace -l
교체 여부 확인
$ git log --author=user@wrong.email --all
자,그러면다를사용하지않고모두사용할수있습니다git replace
(아직) 배치 모드가 없기 때문에 셸 루프를 사용하거나 "수동으로" 교체해야 합니다.
테스트 안 했어!YMMV
를 클릭합니다Note that you might encounter some rough corners when using refs/replace/
mechanism: it is new, and not yet very well tested.
git에는 커밋자(변경을 실행한 사람)용과 작성자(변경을 작성한 사람)용 두 개의 다른 이메일 주소가 저장됩니다.
는 커밋 정보가 됩니다.git log -1 --format=%cn,%ce
사용)show
log
을 참조)
, 마지막 약속의 작성자를 변경하는 것은 .git commit --amend --author "Author Name <email@example.com>"
커밋 정보에 대해 동일한 작업을 수행하는 단일 행이나 인수는 없습니다.
해결책은 사용자 정보를 (일시적으로 또는 일시적으로) 변경한 후 커밋을 수정하는 것입니다.커밋은 커밋을 현재 정보로 갱신합니다.
git config user.email my_other_email@example.com
git commit --amend
현재 사용자 및 현재 타임스탬프에 대한 모든 커밋(첫 번째 커밋 포함)을 리셋하는 경우:
git rebase --root --exec "git commit --amend --no-edit --date 'now' --reset-author"
중 몇 개만 에는 이 커밋을 할 수 .git reset
★★★★★★★★★★★★★★★★★」git 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
이클립스
'local_master_user_x'는 'local_master_user_x'입니다.이 커밋은 비활성 사용자 때문에 리모트브런치 'master'에 푸시할 수 없습니다.
- 원격 브랜치 '마스터' 체크 아웃
- 'local_master_user_x'에 변경 내용이 포함된 프로젝트/폴더/파일을 선택하십시오.
- 오른쪽 클릭 - 치환 - 브런치 - 'local_master_user_x'
- 이러한 변경을 다시 커밋합니다.이번에는 올바른 사용자로 로컬브런치 '마스터'에 접속합니다.
- 원격 '마스터'로 푸시
인터랙티브한 rebase를 사용하면 변경할 각 커밋 뒤에 수정 명령을 배치할 수 있습니다.예:
pick a07cb86 Project tile template with full details and styling
x git commit --amend --reset-author -Chead
오늘 작성자 이름의 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="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 머신에서 재실행해야 했기 때문입니다.
당신의 문제는 아주 흔해요."메일 맵을 사용하여 Git의 작성자 목록 수정"을 참조하십시오.
간단하게 하기 위해 프로세스를 쉽게 하기 위한 스크립트를 만들었습니다: git-changemail
이 스크립트를 경로에 배치한 후 다음과 같은 명령을 실행할 수 있습니다.
현재 분기의 작성자 일치 변경
$ git changemail -a old@email.com -n newname -m new@email.com
<>> < <>2 > < < < < < < < < < < < < < < < < < < < < < < < <.
-f
할 수고를$ git changemail -b old@email.com -n newname -m new@email.com -- -f <branch> <branch2>
재포장 시 기존 사용자 표시
$ git changemail --show-both
덧붙여서 변경을 한 후 git-backup-clean을 사용하여 filter-branch에서 백업을 삭제합니다.
저도 예시를 추가하고 싶습니다.지정된 파라미터로 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;
}
언급URL : https://stackoverflow.com/questions/750172/how-do-i-change-the-author-and-committer-name-email-for-multiple-commits
'source' 카테고리의 다른 글
Windows Azure에서 동작하도록 ELMAH를 설정하는 방법엘마에게 404점을 줬어도끼 (0) | 2023.04.21 |
---|---|
윈도우즈 CMD에서 반복적으로 파일 또는 폴더 삭제 (0) | 2023.04.21 |
Android Virtual Device 저장 위치를 변경할 수 있습니까? (0) | 2023.04.21 |
UIButton에서 텍스트 오른쪽에 이미지를 배치하려면 어떻게 해야 합니까? (0) | 2023.04.16 |
OS X에서 $PATH 변수의 현재 값을 확인하려면 어떻게 해야 합니까? (0) | 2023.04.16 |