2012-01-08 4 views
4

대화 형 모드를 사용하지 않고 커밋 (해시로 식별)의 자동 단어를 실행할 수 있습니까? 내가 코드에서 호출해야하므로 rewording을위한 하나의 라이너가 목표입니다.대화 형 rebase없이 단어를 바꿉니 까?

업데이트 :

인라인 용으로 약간 수정했습니다.

git filter-branch --msg-filter "ruby -e \"puts (ENV['GIT_COMMIT'] == '1ba2dd66581f6fbc03d1a6406a0ed61b6473c9ab' ? 'new msg' : STDIN.read)\"" HEAD

순수 bash는 (루비없이)하지만 좋겠지 만, 나는 STDIN은 (읽기 사용) 일을 점점 문제가 있었다.

+0

커밋으로 재설정하고 수정하여 커밋 주석을 변경 한 다음 원래 분기에서 커밋을 각각 체리 선택할 수 있습니다. 그러나 그것보다 쉬운 방법이있는 것처럼 보입니다. –

+0

['git-filter-branch'] (http://linux.die.net/man/1/git-filter-branch)와 같이 사용할 수 있습니다. 특히 --msg-filter 옵션을 사용할 수 있습니다. 그러나 나는 그것을 고쳐 쓰는 방법을 알아내는 데 어려움을 겪고 있습니다. –

+0

순수한 bash에서 이것을하려고한다면 조건부 로직을 어떻게 수행해야할지 모르겠지만 'if'의 경우에는 'echo'를 사용할 수 있고 'else'의 경우에는'cat STDIN을 STDOUT으로 복사합니다. –

답변

5

git-filter-branch 원하는대로 할 수 있습니다. 특히, 인수가 필요합니다.

커밋 메시지를 다시 쓰는 필터입니다. 인수는 셸에서 표준 입력의 원래 커밋 메시지와 함께 평가됩니다. 표준 출력이 새 커밋 메시지로 사용됩니다.

한 주름 git-filter-branch 당신은 하나 커밋 (다음 효과적으로 나머지를 리베이스) 다시 할 때, 모든이 지점에서 커밋 에서 실행하고자하는 것입니다. 따라서 메시지 필터에는 새로운 커밋 코멘트 (실제로 커밋하려는 커밋에 대한 커밋) 또는 원래의 커밋되지 않은 커밋 메시지 (다른 모든 커밋)를 출력하는 조건부 논리가 있어야합니다.

이 트릭을 수행합니다 : 그것은 당신의 스크립트를 호출하기 전에 완전히 /path/to/filter.rb을 규정 할 필요가 없도록

git filter-branch --msg-filter "ruby /path/to/filter.rb 843c2da5e07de914ea2319fa3295730ff8b3b0a1 'New message'" HEAD 

git-filter-branch는, 현재 디렉토리를 변경합니다.

여기 filter.rb입니다 :

if ENV['GIT_COMMIT'] == ARGV[0] 
    puts ARGV[1] 
else 
    puts STDIN.read 
end 

이것은 아마 별도의 파일에 메시지 필터 스크립트를주지 않고 아마도, 쉘 스크립트에 더 간결하게 다시 작성할 수 있습니다; 하지만 저는 Windows에서 돌아가고있어 그렇게 멋진 것은 없습니다. 나는 Ruby를 사용하기 때문에 그것을 사용했다.

+0

훌륭한 서비스! 해시 코드의 의미가 약간 변경되었지만, 'git'은 일반적으로 해시 코드가 모호한 경우 불평합니다. 코드가 모호한 해시 코드에 대한 모든 커밋을 변경하는 것으로 보입니다. 문제가 아니라 염두에 두어야 할 것 : 미안한 것보다 안전합니다. – alf

+0

@alf, 필자는 같은 7 자리 16 진수 접두어를 가진 두 개의 커밋에 대해 생각조차하지 않았습니다.이 경우에는 바람직하지 않은 영향을 미칠 수 있습니다. 안전을 위해 전체 해시가 필요하도록 코드를 변경했습니다. OP가 이것을 프로그래밍 방식으로 호출하는 경우 어쨌든 전체 해시를 사용할 수 있습니다. –

관련 문제