기록에서 특정 커밋의 작성자를 변경하고 싶습니다. 마지막 커밋이 아닙니다.
이 질문에 대해 알고 있습니다. git에서 커밋 작성자를 어떻게 변경합니까?
하지만 해시 또는 짧은 해시로 커밋을 식별하는 것에 대해 생각하고 있습니다.
질문자 :MicTech
기록에서 특정 커밋의 작성자를 변경하고 싶습니다. 마지막 커밋이 아닙니다.
이 질문에 대해 알고 있습니다. git에서 커밋 작성자를 어떻게 변경합니까?
하지만 해시 또는 짧은 해시로 커밋을 식별하는 것에 대해 생각하고 있습니다.
git rebase -i <earliercommit>
)보다 히스토리의 이전 지점에서 대화식으로 리베이스합니다. 리베이스되는 커밋 목록에서 수정하려는 해시 옆에 있는 pick
에서 edit
그런 다음 git이 커밋을 변경하라는 메시지를 표시하면 다음을 사용합니다.
git commit --amend --author="Author Name <email@address.com>" --no-edit
예를 들어 커밋 기록이 ABCDEF
이고 F
가 HEAD
C
및 D
의 작성자를 변경하려는 경우...
git rebase -i B
지정합니다( git rebase -i B
명령을 실행한 후 표시되는 내용의 예가 있습니다 ).A
를 편집해야 하는 경우 git rebase -i --root
C
와 D
의 라인을 pick
에서 edit
:wq
입력).C
git commit --amend --author="Author Name <email@address.com>"
git rebase --continue
D
에서 다시 일시 중지됩니다.git commit --amend --author="Author Name <email@address.com>"
다시git rebase --continue
git push -f
를 사용하여 업데이트된 커밋으로 오리진을 업데이트합니다.허용 대답 이 질문에 대한 대화 형 REBASE의 멋지고 영리한 사용하지만 우리는 이후에 합병되었다 지점에 예전의 저자을 변경하려는 커밋 경우는 불행하게도 충돌을 나타낸다. 더 일반적으로, 그것은 일을하지 않습니다 지저분한 역사를 다룰 때.
git 기록을 다시 작성하기 위해 환경 변수 설정 및 설정 해제에 의존하는 스크립트를 실행하는 것이 두렵기 때문에 이 답변 과 유사하지만 더 완전한 이 게시물을 기반으로 새 답변을 작성하고 있습니다.
다음은 연결된 답변과 달리 테스트되고 작동합니다. 설명의 명확성을 위해 03f482d6
은 작성자를 교체하려는 42627abe
는 새 작성자와의 커밋이라고 가정합니다.
수정하려는 커밋을 확인하십시오.
git checkout 03f482d6
작성자를 변경하십시오.
git commit --amend --author "New Author Name <New Author Email>"
42627abe
가정된 새 커밋이 있습니다.
원래 지점을 확인하십시오.
로컬에서 이전 커밋을 새 커밋으로 교체합니다.
git replace 03f482d6 42627abe
교체를 기반으로 모든 향후 커밋을 다시 작성합니다.
git filter-branch -- --all
청결을 위해 교체품을 제거하십시오.
git replace -d 03f482d6
새 기록을 푸시합니다(아래에서 실패하는 경우에만 --force를 사용하고 git log
및/또는 git diff
하여 온전한 상태를 확인한 후에만 사용).
git push --force-with-lease
4-5 대신 새 커밋으로 리베이스할 수 있습니다.
git rebase -i 42627abe
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
수정된 기록을 GitHub에 푸시합니다.
git push --force --tags origin 'refs/heads/*'
또는 분기의 선택한 참조를 푸시하려면 다음을 사용하십시오.
git push --force --tags origin 'refs/heads/develop'
이메일을 전역적으로 구성으로 재설정합니다.
git config --global user.email example@email.com
이제 편집할 필요 없이 커밋 작성자를 재설정합니다.
git commit --amend --reset-author --no-edit
아래 명령을 사용하여 마지막 커밋의 작성자를 변경할 수 있습니다.
git commit --amend --author="Author Name <email@address.com>"
그러나 둘 이상의 커밋 작성자 이름을 변경하려면 약간 까다롭습니다. 대화형 리베이스를 시작한 다음 커밋을 편집으로 표시한 다음 하나씩 수정하고 완료해야 합니다.
git rebase -i
리베이스를 시작합니다. 그것은 당신에게 이것과 같은 것을 보여줄 것입니다.
작성자 이름을 변경하려는 커밋에 대해 edit
pick
키워드를 변경합니다.
그런 다음 편집기를 닫습니다. 초보자의 경우 Escape
누른 다음 :wq
를 Enter
누르십시오.
그러면 아무 일도 없었던 것처럼 터미널이 표시됩니다. 실제로 당신은 대화형 rebase의 한가운데에 있습니다. 이제 위의 명령을 사용하여 커밋의 작성자 이름을 수정할 차례입니다. 편집기가 다시 열립니다. git rebase --continue
리베이스를 종료하고 계속하십시오. 편집하려는 커밋 수에 대해 동일한 작업을 반복합니다. No rebase in progress?
되면 대화형 rebase가 완료되었는지 확인할 수 있습니다. 메세지.
귀하가 링크한 질문의 답변은 좋은 답변이며 귀하의 상황을 다룹니다(다른 질문은 여러 커밋을 다시 작성해야 하기 때문에 더 일반적입니다).
git filter-branch
를 시도하기 위한 핑계로 주어진 커밋에 대해 작성자 이름 및/또는 작성자 이메일을 다시 작성하는 스크립트를 작성했습니다.
#!/bin/sh # # Change the author name and/or email of a single commit. # # change-author [-f] commit-to-change [branch-to-rewrite [new-name [new-email]]] # # If -f is supplied it is passed to "git filter-branch". # # If <branch-to-rewrite> is not provided or is empty HEAD will be used. # Use "--all" or a space separated list (eg "master next") to rewrite # multiple branches. # # If <new-name> (or <new-email>) is not provided or is empty, the normal # user.name (user.email) Git configuration value will be used. # force='' if test "x$1" = "xf"; then force='-f' shift fi die() { printf '%s\n' "$@" exit 128 } targ="$(git rev-parse --verify "$1" 2>/dev/null)" || die "$1 is not a commit" br="${2:-HEAD}" TARG_COMMIT="$targ" TARG_NAME="${3-}" TARG_EMAIL="${4-}" export TARG_COMMIT TARG_NAME TARG_EMAIL filt=' if test "$GIT_COMMIT" = "$TARG_COMMIT"; then if test -n "$TARG_EMAIL"; then GIT_AUTHOR_EMAIL="$TARG_EMAIL" export GIT_AUTHOR_EMAIL else unset GIT_AUTHOR_EMAIL fi if test -n "$TARG_NAME"; then GIT_AUTHOR_NAME="$TARG_NAME" export GIT_AUTHOR_NAME else unset GIT_AUTHOR_NAME fi fi ' git filter-branch $force --env-filter "$filt" -- $br
다음 전에 커밋:
모든 커밋에 대한 작성자를 수정하려면 @Amber의 답변에서 명령을 적용할 수 있습니다.
git commit --amend --author="Author Name <email@address.com>"
또는 이름과 이메일을 재사용하려면 다음과 같이 작성하면 됩니다.
git commit --amend --author=Eugen
명령 후 커밋:
예를 들어 4025621부터 모두 변경하려면 다음을 4025621
.
다음을 실행해야 합니다.
git rebase --onto 4025621 --exec "git commit --amend --author=Eugen" 4025621
참고: 이름 및 이메일 주소와 같은 공백이 포함된 작성자를 포함하려면 작성자를 이스케이프된 따옴표로 묶어야 합니다. 예를 들어:
git rebase --onto 4025621 --exec "git commit --amend --author=\"Foo Bar <foo@bar.com>\"" 4025621
또는 이 별칭을 ~/.gitconfig
추가하십시오.
[alias] reauthor = !bash -c 'git rebase --onto $1 --exec \"git commit --amend --author=$2\" $1' --
그런 다음 다음을 실행합니다.
git reauthor 4025621 Eugen
Eugen Konkov 답변을 향상시키기 위해 루트 커밋에서 시작하려면 --root
플래그를 사용하십시오. --no-edit
플래그도 도움이 됩니다. 이 플래그를 사용하면 각 커밋에 대해 편집기에 프롬프트가 표시되지 않기 때문입니다.
git rebase --root --exec "git commit --amend --author='name <email>' --no-edit"
사용자를 빠르게 변경할 수 있고 다른 커밋에 부작용이 없는 방법을 찾으십시오.
git config user.name "New User" git config user.email "newuser@gmail.com" git log git rebase -i 1f1357 # change the word 'pick' to 'edit', save and exit git commit --amend --reset-author --no-edit git rebase --continue git push --force-with-lease
git log
git config user.name "New User" git config user.email "newuser@gmail.com" git rebase -i 1f1357 # change word pick to edit, save and exit edit 809b8f7 change code order pick 9baaae5 add prometheus monitor kubernetes edit 5d726c3 fix liquid escape issue edit 3a5f98f update tags pick 816e21c add prometheus monitor kubernetes
Stopped at 809b8f7... change code order You can amend the commit now, with git commit --amend Once you are satisfied with your changes, run git rebase --continue
refs/heads/master.
성공적으로 될 때까지 rebase를 확인하고 계속하십시오. # each continue will show you an amend message # use git commit --amend --reset-author --no-edit to comfirm # use git rebase --skip to skip git commit --amend --reset-author --no-edit git rebase --continue git commit --amend --reset-author --no-edit ... git rebase --continue Successfully rebased and updated refs/heads/master.
git push --force-with-lease
중앙 집중식 리포지토리를 사용하는 경우 Amber의 답변에 한 가지 추가 단계가 있습니다.
git push -f
중앙 저장소 업데이트를 강제 실행합니다.
같은 브랜치에서 작업하는 사람이 많지 않으면 일관성이 떨어질 수 있으니 주의하세요.
git rebase -i
할 때 문서에 다음과 같은 흥미로운 부분이 있습니다.
두 개 이상의 커밋을 하나로 접고 싶다면 두 번째 및 후속 커밋에 대해
"pick"
"squash"
또는"fixup"
바꾸십시오. 커밋의 작성자가 다른 경우 접힌 커밋은 첫 번째 커밋의 작성자에게 귀속됩니다. 접힌 커밋에 대해 제안된 커밋 메시지는 첫 번째 커밋의 커밋 메시지와"squash"
명령의 커밋 메시지를 연결한 것이지만"fixup"
명령의 커밋 메시지는 생략합니다.
ABCDEF
의 이력이 있는 경우B
와 D
(= 2 커밋)를 변경하려는 경우다음을 수행할 수 있습니다.
git config user.name "Correct new name"
git config user.email "correct@new.email"
git commit --allow-empty -m "empty"
git rebase -i B^
B^
선택의 부모 B
.pick
을 squash
로 변경하고 싶을 것입니다. git rebase -i B^
가 제공하는 것의 예:
pick sha-commit-B some message pick sha-commit-C some message pick sha-commit-D some message pick sha-commit-E some message pick sha-commit-F some message # pick sha-commit-empty1 empty # pick sha-commit-empty2 empty
다음과 같이 변경하십시오.
# change commit B's author pick sha-commit-empty1 empty squash sha-commit-B some message # leave commit C alone pick sha-commit-C some message # change commit D's author pick sha-commit-empty2 empty squash sha-commit-D some message # leave commit EF alone pick sha-commit-E some message pick sha-commit-F some message
메시지를 편집하라는 메시지가 표시됩니다.
# This is a combination of 2 commits. # The first commit's message is: empty # This is the 2nd commit message: ...some useful commit message there...
처음 몇 줄만 제거하면 됩니다.
변경하려는 커밋이 마지막 커밋이 아닌 경우 다음 단계를 수행합니다. 커밋이 다른 분기에 있으면 먼저 해당 분기로 전환하십시오.
자식 체크 아웃 분기 이름
변경하려는 커밋 이전에 커밋을 찾아 해시를 찾습니다. 그런 다음 rebase 명령을 실행하십시오.
git rebase -i -p 커밋 해시
그런 다음 편집기가 열리고 변경하려는 커밋에 대해 '편집'을 입력합니다. 다른 사람들은 기본 '선택' 옵션으로 둡니다. 일단 변경되면 'esc' 키와 wq를 입력하십시오! 나가기 위해서.
그런 다음 수정 옵션과 함께 git commit 명령을 실행합니다.
git commit --amend --author="사용자 이름 이메일" --no-edit
그런 다음 다음 명령을 실행하십시오.
git rebase --계속
커밋 작성자가 로컬 리포지토리에서 업데이트되면 변경 사항을 원격 리포지토리로 푸시합니다.
커밋 푸시 후 작성자 이름을 바꾸는 단계
git rebase i HEAD~10 (10은 rebase에 표시할 총 커밋입니다)
If you Get anything like below
fatal: It seems that there is already a rebase-merge directory, and I wonder if you are in the middle of another rebase. If that is the case, please try
git rebase (--continue | --abort | --skip)
If that is not the case, please rm -fr ".git/rebase-merge" and run me again. I am stopping in case you still have something valuable there.
그런 다음 필요에 따라 "git rebase --continue" 또는 "git rebase --abort"를 입력합니다.
pick 897fe9e simplify code a little
pick abb60f9 add new feature
pick dc18f70 bugfix
이제 아래와 같이 편집하려는 커밋 바로 아래에 아래 명령을 추가해야 합니다.
pick 897fe9e simplify code a little exec git commit --amend --author 'Author Name <author.name@mail.com>' pick abb60f9 add new feature exec git commit --amend --author 'Author Name <author.name@mail.com>' pick dc18f70 bugfix exec git commit --amend --author 'Author Name <author.name@mail.com>'
그게 다야, 이제 ESC, :wq를 누르면 모든 설정이 완료됩니다.
그런 다음 git push origin HEAD:BRANCH NAME -f [-f Force push를 처리하십시오]
git push -f
또는 git push origin HEAD: dev -f
선택 사항: 원격으로 전송하지 않으려면 로컬 변경 사항을 숨겨야 합니다.
$ git status $ git stash
$ git log // Old author in local and remote $ git commit --amend --author="Author Name <email@address.com>" $ git log // New Author in local $ git push origin <branch> --force-with-lease $ git log // New Author in remote
그런 다음 git stash
를 사용한 경우 단계적 변경 사항을 복구합니다.
$ git stash pop $ git status
그런 다음 현재 프로젝트의 다음 커밋에 대한 구성을 업데이트해야 합니다.
$ git config user.name "Author Name" $ git config user.email "<email@address.com>"
git config --edit
하여 이것을 확인하거나 편집하십시오.
설명: $ ggpush -f
를 사용하여 커밋을 잃는 경우 reflog 로 복구할 수 있습니다. 어쨌든 --force-with-lease
-f
만 사용하는 것보다 훨씬 더 보호됩니다.
지엘
특히 변경하려는 커밋이 두 개 이상인 경우 이 문제에 대한 게으른 접근 방식도 있습니다. 제 경우에는 작성자가 잘못된 여러 커밋이 있는 새 분기가 있었는데 무엇이 도움이 되었나요?
원래 지점으로 이동:
git checkout develop
그것에서 새 분기를 만듭니다.
git checkout -b myFeature develop
커밋 정보 없이 하나의 커밋으로 병합합니다.
git merge --no-commit --squash branchWrongAuthor
변경 사항을 준비할 수도 있습니다.
git stage .
작성자 이름을 변경하고 변경 사항을 커밋합니다.
git commit --amend --author "New Author Name <New Author Email>" -m "new feature added"
그게 다야, 당신은 변경 사항을 푸시할 수 있습니다.
git push
이후 작성자가 잘못된 브랜치를 삭제할 수 있습니다.
github의 공식 페이지에서 이러한 명령을 사용할 수 있습니다.
https://help.github.com/en/github/using-git/change-author-info
여기 명령이 있습니다
#!/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
여기에서 이전 이메일을 새 사용자 이름과 이메일 주소로 변경할 수 있습니다.
병합 커밋 메시지의 경우 적어도 gitlab에서는 rebase
를 사용하여 수정할 수 없다는 것을 알았습니다. 병합을 커밋으로 표시하지만 해당 #sha에 리베이스할 수 없습니다.이 게시물이 유용하다는 것을 알았습니다.
git checkout <sha of merge> git commit --amend # edit message git rebase HEAD previous_branch
이 세 줄의 코드는 병합 커밋 메시지(예: 작성자)를 변경하는 작업을 수행했습니다.
전 세계적으로 커미터 이름 및 이메일 변경:
$ git config --global user.name "John Doe" $ git config --global user.email "john@doe.org"
저장소별 커미터 이름 및 이메일 변경:
$ git config user.name "John Doe" $ git config user.email "john@doe.org"
다음 커밋을 위한 작성자 정보 변경:
$ git commit --author="John Doe <john@doe.org>"
힌트 : 다른 상황과 자세한 정보를 보려면 포스트 참조를 읽으십시오.
해결책
git filter-repo
설치 (Git 프로젝트 는 filter-branch
보다 filter-repo
권장)
$ PACKAGE_TOOL install git-filter-repo
다음을 포함하는 git 저장소의 루트에 .mailmap
파일을 만듭니다.
New Name <new@ema.il> <old@ema.il>
git filter-repo --use-mailmap
자세한 내용은
git-filter-repo
는 이것을 문서의 예로 나열합니다..mailmap
파일을 사용하는 대신 --mailmap <filename>
인수와 함께 git filter-repo
를 호출하여 고유한 파일을 지정할 수 있습니다.git-filter-repo
프로젝트의 README.md 에서 찾을 수 있습니다.예를 들어 포맷 후 또는 이러한 명령을 (올바르게) 설정하지 않고 Git을 올바르게 구성하지 않은 경우와 같이 시스템에서 설정이 누락된 경우 발생할 수 있습니다.
git config user.name "Author Name" git config user.email "<email@address.com>"
Atlassian이 작성한 이 기사를 따라 생활을 더 단순하게 만드시지 않겠습니까?
git commit --amend --author="Author Name <email@address.com>"
master
. 따라서 소스 코드 저장소에 의해 보호됩니다.git push origin master --force
이것이 마지막 커밋에 대한 가장 간단한 시나리오입니다. "무작위" 커밋을 선택하려면 다음이 필요합니다.
git rebase -i <Earlier Commit>.
edit
pick
변경git commit --amend --author="Author Name <email@address.com>"
master
. 따라서 소스 코드 저장소에 의해 보호됩니다.git push origin master --force
푸시하기 전에 항상 git log
하여 현재 위치를 확인할 수 있습니다.
변경해야 하는 것이 AUTHOR OF THE LAST 커밋이고 다른 사람이 저장소를 사용하지 않는 경우 다음을 사용하여 마지막 커밋을 취소할 수 있습니다.
git push -f origin last_commit_hash:branch_name
다음을 사용하여 커밋의 작성자 이름을 변경하십시오.
git commit --amend --author "type new author here"
열려 있는 편집기를 종료하고 코드를 다시 푸시합니다.
git push
가장 많이 투표된 질문에 적용할 수 있는 바로 가기가 있습니다: edit
대신 exec
사용.
exec
는 지정된 커밋에서 명령을 실행할 수 있습니다.
그것을 사용하지 않도록 할 수 있습니다 사용하여 edit
터미널에 종료하고, 실행, git
각각의 자식에 대한 명령은 커밋합니다.
이는 기록에서 여러 커밋을 변경해야 하는 경우 특히 유용합니다.
단계는 다음과 같습니다.
git rebase -i <earliercommit>
)exec git commit --amend --author="Author Name <email@address.com>" --no-edit
(또는 --reset-author
git 구성에 설정된 값으로 재설정하려는 경우)예제 편집기 콘텐츠(처음 2개 커밋 작성자 변경):
pick 1fc6c95 Patch A exec git commit --amend --author="Author Name <email@address.com>" --no-edit pick 6b2481b Patch B exec git commit --amend --author="Author Name <email@address.com>" --no-edit pick dd1475d something I want to split pick c619268 A fix for Patch B pick fa39187 something to add to patch A pick 4ca2acc i cant' typ goods pick 7b36971 something to move before patch B # Rebase 41a72e6..7b36971 onto 41a72e6 # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # If you remove a line here THAT COMMIT WILL BE LOST. # However, if you remove everything, the rebase will be aborted. #
출처 : http:www.stackoverflow.com/questions/3042437/how-to-change-the-commit-author-for-one-specific-commit
CSS에서 여백과 패딩을 사용하는 경우 [닫힘] (0) | 2021.11.19 |
---|---|
요청 본문이 있는 HTTP GET (0) | 2021.11.19 |
"git export"(예: "svn export")를 수행합니까? (0) | 2021.11.19 |
Git이 파일 모드(chmod) 변경을 무시하도록 하려면 어떻게 해야 합니까? (0) | 2021.11.19 |
Git에서 여러 커밋의 작성자 및 커미터 이름과 이메일을 변경하는 방법은 무엇입니까? (0) | 2021.11.19 |