Giit의 commiit 이름과 메일 주소를 과거와 함께 변경

7186 단어 GitGitHubtech

과제.


Giit의commiit 이름과 메일 주소를 과거로 거슬러 올라가서 다시 쓰고 싶어요.

날과 씨


Giithub의 창고가 privte에서 공공으로 변경되는 동안 문제가 발생했습니다.
과거의commiit의 이름과 주소는 공개하고 싶지 않았다.
그래서 나는 과거를 거슬러 올라가 대량의 제출 이력서를 고치기로 결정했다.

고쳐 쓰고 싶은 것


과거commiit에 존재했던 다음 네 항목을 바꾸려고 합니다.
  • author name
  • author email
  • committer name
  • committer email
  • git log의 기본적으로 author만 보이기 때문에 주의해야 합니다.
    자세한 log는 다음 명령을 시도해 보십시오.
    git log --all --pretty=full --graph
    
    author와commiitter의 차이 등에 대해서는 공식 문서를 참조하십시오.

    다시 쓸 범위


    모든 로컬 및 모든 원격 분기

    해결책


    다시 쓰기 명령


    다음 명령을 실행하면 로컬 지점의 모든 제출을 수정할 수 있습니다.
    이것은 명령의 예다.--env-filter 파라미터의 케이스는 필요에 따라 변경해 주십시오.
    git filter-branch --force --env-filter '
            # GIT_AUTHOR_NAMEの書き換え
            if [ "$GIT_AUTHOR_NAME" = "変更したいauthor name" ];
            then
                    GIT_AUTHOR_NAME="変更後のauthor name";
            fi
            # GIT_AUTHOR_EMAILの書き換え
            if [ "$GIT_AUTHOR_EMAIL" = "変更したいauthor email" ];
            then
                    GIT_AUTHOR_EMAIL="変更後のauthor email";
            fi
            # GIT_COMMITTER_NAMEの書き換え
            if [ "$GIT_COMMITTER_NAME" = "変更したいcommitter name" ];
            then
                    GIT_COMMITTER_NAME="変更後のcommitter name";
            fi
            # GIT_COMMITTER_EMAILの書き換え
            if [ "$GIT_COMMITTER_EMAIL" = "変更したいcommitter email" ];
            then
                    GIT_COMMITTER_EMAIL="変更後のcommitter email";
            fi
            ' -- --all
    

    명령에 대한 간단한 설명

    git filter-branch:git역사를 통일적으로 개작하라는 명령.--force:refs/original에 백업도 실행할 수 있는 옵션이 있습니다.--env-filter: 제출 자체의 정보(author/commiiter name/email/time 등)를 수정하는 옵션입니다.--: 변경 사항의 적용 범위를 결정하는 옵션입니다.범위는 각양각색의 변화가 있을 것 같다.이번에는 모든 지역 지점에 적용하고 싶어서 지정했다--all.
    자세한 내용은 공식 문서를 참조하십시오.

    명령 실행 후의 상태


    여기서 다음 명령을 수행하고 확인하세요.
    git log --all --pretty=full --graph
    
    원격 추적 지점을 포함한 모든 로컬 지점의 역사가 바뀌었음을 확인할 수 있습니다.
    동시에refs/original 개작 전의 역사도 존재한다.
    이것은git가 실행할 때 git filter-branch 자동으로 남긴 백업입니다.
    마음에 드는 사람은 아래의 지령으로 삭제하세요.(귀중한 백업이므로 잘 고려해 삭제해 주십시오.)
    git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
    
    다음 명령을 사용하여 결과를 다시 확인하십시오.
    git log --all --pretty=full --graph
    
    개작된 역사만이 존재한다고 생각합니다.

    원격 분기에 반영


    그리고 다음 명령을 사용하여 모든 로컬 지점에 push를 하면 원격도 반영됩니다.
    git push --all --force origin
    
    로컬 분기가 없는 원격 분기에는 변경 사항이 반영되지 않습니다.

    로컬 창고에서 변경된 흔적을 지우다


    지금까지의 작업은 역사를 성공적으로 고쳤지만, 고쳐 쓰기 전의 흔적은 로컬 창고에 남아 있습니다.
    당신의 창고뿐만 아니라 모든 현지 창고도 말할 수 있습니다.
    예컨대
    git checkout 改竄前の歴史のコミットid
    
    변조 전의 상태를 복원할 수 있다.
    원래는 기릿 사용법으로 남아있었겠죠.
    여기서부터 왜곡된 흔적을 지우는 방법을 써야 한다.
    자세한 내용은 공식 사이트를 보십시오.

    흔적 지우기


    원격 웨어하우스git clone에서 작업을 다시 수행합니다.
    이렇게 하면 흔적을 없앨 수 있는 손상되지 않은 창고를 얻을 수 있다.
    원래의 로컬 창고에 관해서는 백업으로 저장하거나 삭제하거나 취향에 따라 저장하십시오.

    흔적 지우기 2


    어떻게든 다시 할 수 없다git clone면 아래메서드가 있다.
    공식 홈페이지에 따르면 일하기 전에 백업을 하고 그렇지 않으면 포기하는 파괴적인 방법이다.
    도저히 다시 할 수 없는 사람git clone은 백업을 바탕으로 다음과 같은 방법을 시도해 보세요.

    refs/original 제거

    refs/original 왜곡 전의 역사가 존재한다.
    다음 명령을 사용하여 삭제할 수 있습니다.
    git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
    
    다음 명령을 사용하여 결과를 다시 확인하십시오.
    git log --all --pretty=full --graph
    
    개작된 역사만이 존재한다고 생각합니다.

    reflowg 지우기


    git의reflowg를 삭제합니다.
    reflowg는 지점과 HEAD가 제출한 역사를 참고한 것입니다.
    로컬 창고에 존재하는 역사입니다.
    다음 명령을 실행하십시오.
    git reflog expire --expire=now --all
    
    이렇게 지나간 리플로우는 모두 지워졌다.
    자세한 내용은 공식 사이트를 보십시오.

    변경되지 않은 Git 객체 삭제


    변조되지 않은 Git 객체를 삭제합니다.
    간단하게 말하면 Giit 대상은 제출할 때 창고 상태의 스냅샷입니다.
    리플로우를 삭제하는 것은 변경되기 전의 역사 연표를 삭제하는 것과 같다.
    이번에는 왜곡 전의 역사 자체를 삭제한다.
    다음 명령을 실행하십시오.
    git gc --prune=now
    
    Giit 객체가 필요하지 않은 모든 명령을 제거합니다.
    여기서'필요 없다'는 말은'지트의 역사에서 종점까지 갈 수 없다'는 뜻이다.
    리플로우를 없앴기 때문에 왜곡되기 전의 역사는'지트의 역사에서 갈 수 없는'으로 바뀌었다.
    리플로우를 삭제하는 것은 git gc --prune=now에서'필요없는'깃 대상을 지우기 위해서라고 할 수 있다.
    자세한 내용은 공식 사이트를 보십시오.
    따라서 로컬 창고에서 변경된 흔적을 모두 삭제했다.
    이렇게 되자 왜곡된 역사, 역사가 가리키는 사실은 모두 사라졌다.

    원격 브랜치와 동기화 주의


    주의fetch

    git filter-branch를 실행할 때 -- --all를 지정하면 모든 로컬 지점의 역사가 왜곡됩니다.
    원격 추적 지점의 역사도 왜곡되었다.원격 추적 지점은 로컬 지점의 일종이기 때문이다.원격 추적 지점은 원격 지점이 아닙니다.git fetch 이외에 원격 추적 분기는 원격 분기와 동기화되지 않습니다.
    반면git fetch은 원격 추적 지점과 원격 창고 상태가 동기화된다.git push 작업 전에 동기화하면 원격 추적 지점은 변경 전 상태로 돌아갑니다.
    물론 Giit 대상도 복원되었다
    git checkout 改竄前の歴史のコミットid
    
    변조 전의 상태를 복원할 수 있다.
    왜곡 전의 모든 흔적을 지우고 싶으신 분들은 주의하세요.

    VScode와 같은 개발 도구에 주의하십시오


    VScode는 자동git fetch 기능을 제공합니다.
    원칙적으로 왜곡 전의 상태를 자동으로 복원한다.
    VScode뿐만 아니라 GTI를 관리하기 위해 편리한 도구를 사용하는 사람은 이 점을 주의하십시오.
    도구 설정을 바꾸는 등 해결 방법이 있지만 테미널을 사용하는 것은 확실하다고 생각합니다.

    최후


    지트의 역사를 다시 쓰는 것은 파멸적인 결과가 될 가능성이 크다.
    혼자 개발하면 괜찮을지도 몰라요.
    하지만 팀 개발이라면 파멸적인 작업을 수행하기 전에 팀 담당자와 상의해야 한다.
    쓰다가 쓰다 보니까 조조 5부 보스의 파편이 생각나네요.

    좋은 웹페이지 즐겨찾기