programing

Git에서 작성자를 변경하기 위해 여러 커밋을 수정하는 방법.

bestprogram 2023. 5. 2. 23:02

Git에서 작성자를 변경하기 위해 여러 커밋을 수정하는 방법.

나는 Git에서 일련의 커밋을 했고 이제 내가 내 사용자 이름과 사용자 이메일 속성을 올바르게 설정하는 것을 잊었다는 것을 깨달았습니다(새 컴퓨터).아직 이러한 커밋을 저장소에 푸시하지 않았는데, 이 커밋을 수정하기 전에 어떻게 수정할 수 있습니까(마스터 분기에 대한 최근 커밋만 3개)?

나는 계속 보고 있었습니다.git reset그리고.git commit -C <id> --reset-author저는 제가 올바른 방향으로 가고 있다고 생각하지 않습니다.

경고: 이제 필터-레포를 위해 더 이상 사용되지 않습니다.

필터 분기 기능을 손끝으로 사용할 수 있는 경우 기본 재배치/수정은 비효율적입니다.

git filter-branch --env-filter 'if [ "$GIT_AUTHOR_EMAIL" = "incorrect@email" ]; then
     GIT_AUTHOR_EMAIL=correct@email;
     GIT_AUTHOR_NAME="Correct Name";
     GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL;
     GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; fi' -- --all

(명확성을 위해 선을 가로질러 표시되지만 필요하지 않음)

작업이 완료되면 결과를 검사하여 의도하지 않은 내용을 변경하지 않았는지 확인하십시오.

대화형 리베이스 접근법은 exec과 함께 사용할 때 매우 유용합니다.특정 커밋 또는 기본 재배치의 모든 커밋에 대해 셸 명령을 실행할 수 있습니다.

먼저 Git 작성자 설정을 설정

git config --global user.name "John Doe"
git config --global user.email johndoe@example.com

그런 다음 지정된 후 모든 커밋에 대해 작성자를 재설정하려면 다음과 같이 하십시오.BASE_SHA:

git rebase -i BASE_SHA -x \
  "git commit --amend --author 'John Doe <johndoe@example.com>' -CHEAD"

변경 내용을 확인하기 위해 편집기가 팝업됩니다.여기서 필요한 것은 저장하고 끝내기만 하면 각 커밋을 통과하고 -x 플래그에 지정된 명령을 실행합니다.

마지막 커밋에 대해서만 작성자를 변경하려면:

git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit

마지막 N개 커밋에 대한 작성자만 변경하려고 한다고 가정합니다.

git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit"

커미터도 변경합니다.

@sshine과 @Hermann에 의해 언급된 것처럼.그루버, 이전 명령은 작성자만 변경합니다.커미터도 변경하려면 @Hermann이 제안한 솔루션을 사용할 수 있습니다.그루버:

git rebase -i HEAD~4 -x "GIT_COMMITTER_NAME='Author Name' GIT_COMMITTER_EMAIL='author.name@gmail.com' git commit --amend --author 'Author Name <author.name@gmail.com>' --no-edit"

메모들

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

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

pick 897fe9e simplify code a little
pick abb60f9 add new feature
exec git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit
pick dc18f70 bugfix

여기서 가장 많이 투표된 답변은 이제 구식입니다.Git 필터 브랜치를 사용할 때 Git는 이 무서운 경고를 보여줍니다.

WARNING: git-filter-branch has a glut of gotchas generating mangled history
         rewrites. Hit Ctrl-C before proceeding to abort, then use an
         alternative filtering tool such as 'git filter-repo'
         (https://github.com/newren/git-filter-repo/) instead.

filter-repoGit의 일부가 아니므로 별도로 설치해야 합니다.

# Requires git v2.22+ and python v3.5+. Check with -
git --version && python3 --version
    
# Install using pip
pip install git-filter-repo    
    

이전 커밋의 전자 메일만 바꾸려면 다음과 같은 명령을 실행합니다.

git filter-repo --email-callback '
    return email if email != b"incorrect@email" else b"correct@email"
' 

이전 커밋의 전자 메일과 작성자 이름을 모두 바꾸려면 다음과 같은 명령을 실행합니다.

git filter-repo --commit-callback '
    if commit.author_email == b"incorrect@email":
        commit.author_email = b"correct@email" 
        commit.author_name = b"Correct Name"
        commit.committer_email = b"correct@email" 
        commit.committer_name = b"Correct Name"
' 

터미널에 명령을 붙여넣을 때 들여쓰기가 있는지 확인합니다.콜백은 파이썬 구문을 사용하므로 들여쓰기가 중요합니다.

문서에서 필터-레포 콜백에 대해 자세히 알아보십시오.

이 방법은 바로 이 목적을 위해 GitHub에 의해 문서화되었습니다(그러나 GitHub은 이후 이 방법을 제거했습니다).단계는 다음과 같습니다.

  1. 터미널을 열고 레포의 기본 복제본을 만듭니다.
git clone --bare https://github.com/user/repo.git
cd repo
  1. 스크립트를 합니다(「 」( 「 」).OLD_EMAIL,CORRECT_EMAIL,그리고.CORRECT_NAME)
#!/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
  1. 스크립트를 단말기에 복사/붙여넣고 Enter 키를 눌러 스크립트를 실행합니다.
  2. 변사항으로 변경 git push --force --tags origin 'refs/heads/*'그리고 당신은 끝났어요!

있는 것이 찾있는것고은당라고 .git rebase --interactive

특정 커밋으로 재설정한 다음 커밋 추가 또는 그룹화를 변경하는 기록을 작성할 수 있습니다.

여기에 설명이 있습니다. https://web.archive.org/web/20100213104931/http ://blog.madism.org/index.php/2007/09/09/138-git-awsome-ness-git-rebase-interactive

대본을 찾으시는 분들은 이것이 저에게 도움이 되었습니다.

  1. GitHub에서 스크립트를 다운로드하여 쉽게 액세스할 수 있는 위치에 저장합니다.

  2. 스크립트 파일이 실행될 수 있도록 스크립트 파일의 사용 권한을 변경합니다.

    chmod +x changeauthor.sh

  3. 잘못된 커밋 기록이 있는 리포지토리로 이동

    cd path/to/repo

  4. 스크립트 실행(플래그 사용 또는 사용 안 함)

    ../path/to/changeauthor.sh --old-email kaka.ruto@example.com \
        --new-email ruto.kaka@example.com --new-name "Kaka Ruto" --remote origin
    

이렇게 하면 현재 dir 저장소의 모든 기록이 다시 작성되므로 주의하십시오!좋은 점은 스크립트가 당신에게 당신이 하려는 것에 대한 경고와 정보를 제공한다는 것입니다.

여기서 더 읽기 https://www.adamdehaven.com/blog/update-commit-history-author-information-for-git-repository/

이 답변에서 제안된 바와 같이 git-filter-repo작업에 선호됩니다.

그러나 및 메일을 하려면 그나단또작이성및름자다/러는전메자있수니습변경을 사용할 수 .--mailmap또는--use-mailmap콜백 대신에

형식에 따라 메일 맵 파일을 만들어야 합니다(git-filter-repo/message 또는 git-scm.com/docs) 참조).

그런 다음 간단히 실행합니다.

git filter-repo --mailmap .mailmap

언급URL : https://stackoverflow.com/questions/4981126/how-to-amend-several-commits-in-git-to-change-author