2016-08-30 3 views
2

특정 작성자의 모든 커밋을 제거하려면 어떻게합니까? (실수로 커밋되었습니다. 작성자는 커밋 기록에 표시되어서는 안됩니다.)작성자 별 커밋 모두 제거

나는 몇 가지 코드가 이름을 발견했다 -

git filter-branch --env-filter ' 
OLD_EMAIL="[email protected]" 
CORRECT_NAME="name" 
CORRECT_EMAIL="[email protected]" 
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 push --force --tags origin 'refs/heads/*' 

이름을 변경되지만, 커밋을 제거 할 수없는 몇 가지 필터가 있습니까?

+0

커밋이 경우, 사용자 정의 형식을 사용? 그러면 이전 커밋으로 다음 커밋을'rebase '할 수 있습니까? 제거 된 커밋의 변경 사항을 유지하거나 롤백해야합니까? – CoryKramer

+0

그런 커밋의 모든 변경 사항도 제거해야합니다. 이러한 커밋이 끝나면 커밋이 더 많이 수행됩니다. – Dancyg

답변

3

당신은 이런 식으로 작업을 수행 할 수 있습니다 당신이 시작하려는 커밋

  1. 을 기반으로 새 지점을 만듭니다

    git checkout -b <branch-name> <base-commit> 
    
  2. 이없는 모든 커밋 체리 - 선택 일치하는 저자 :

    git log --author "<name>" --invert-grep --reverse --format="format:%H" HEAD..master | xargs git cherry-pick 
    

log은 작성자가 작성한 모든 커밋을 걸러 낸 다음 cherry-pick을 하나씩 차례대로 필터링합니다. (부분적으로 git log 맨 페이지에서 인용) 매개 변수에 대한

설명 :

  • --author "name"
    제한 지정된 패턴 (정규식)와 일치 저자/커미터 헤더 라인들에 커밋 출력. 두 개 이상의 --author =를 사용하면 주어진 패턴 중 하나와 일치하는 작성자가 선택됩니다 (다중 커미터 =와 유사하게).
  • --invert-grep
    제한 --grep로 지정된 패턴과 일치하지 않는 로그 메시지들에 커밋 출력 = 역순으로 커밋
  • --reverse 출력. [...]
  • --format="format:%H" 는 "커밋을 제거"무엇을 의미합니까에만 해시에게
+0

git bash는 마지막으로 커밋 된 커밋에 대해 작성자를 사용하는 것으로 보이지만 로그인 한 것은 아닙니다.그래서 나는 잘못된 저자 밑에서 커밋 된 커밋을 성공적으로 바꿨다. 그 후 내 동료들은 그 피투성한 커밋의 잘못된 저자를 포함하는 버전을 저지른 것입니다.) 그리고 두 사람의 커밋이 나타났습니다 - 동일하지만 diff 작성자와 함께) 나쁜 커밋을 더 많이 바꿨을 때 문제가 해결되었습니다. 저자 왼쪽) – Dancyg

+0

@Dancyg 대개 Git은 로컬 repo (.git/config), 사용자 또는 시스템 전체 파일 (순서대로) 중 하나 인 .gitconfig에 구성된 작성자를 사용합니다. 'git config --get-regexp "user. *"'로 설정 값을 확인할 수 있습니다. –

0

필터 분기를 사용하면 직접 수행 할 수 있습니다. 원하는 시작점으로 새 분기를 만든 다음 필터 분기를 사용하여 원하지 않는 분기를 제거하려는 원하는 커밋에 cherry-pick을 수행합니다.

그런 다음 새 지점에서 주어진 작성자가 작성하지 않은 모든 커밋을 갖게됩니다.

git cherry-pick 범위를 지원하므로 마지막 "양호한"커밋을 저장하고 단일 커밋 대신 커밋 범위를 추가 할 수 있습니다.

또 다른 방법은 git revert이지만 되돌리기는 원래의 커밋을 그대로두고 원래 커밋의 변경 사항을 실행 취소합니다.

관련 문제