문제

이 질문은 이미 여기에 답이 있습니다.

나는 현재 Tortoisehg (Mercurial)를 사용하고 있으며 실수로 잘못된 커밋 메시지를 저질렀습니다. 저장소 에서이 커밋 메시지를 편집하려면 어떻게해야합니까?

도움이 되었습니까?

해결책

업데이트: Mercurial이 추가되었습니다 --amend 그럴 것입니다 이제 선호하는 옵션입니다.


당신은 마지막 커밋을 롤백 할 수 있습니다 (그러나 마지막 커밋 만) hg rollback 그런 다음 다시 적용하십시오.

중요한: 이것 최신 커밋을 영구적으로 제거합니다 (또는 당기기). 그래서 당신이 한 경우 hg update 그 커밋은 더 이상 작업 디렉토리에 있지 않으며 영원히 사라졌습니다. 먼저 사본을 만드십시오.

그 외에는 저장소의 모든 것이 확인되어 있기 때문에 저장소의 기록 (커밋 메시지 포함)을 변경할 수 없습니다. 당신이 할 수있는 유일한 일은 주어진 변경 세트 후에 역사를 정리 한 다음 그에 따라 재현하는 것입니다.

이 중 어느 것도 이미 변경 사항을 게시 한 경우 (모든 사본을 보유 할 수 없다면) GPG가 서명 한 커밋 (다른 사람들)을 포함하는 "기록을 다시 작성"할 수는 없습니다.

다른 팁

글쎄, 나는 이런 식으로했다 :

500 개의 커밋이 있고 잘못된 커밋 메시지가 R.498에 있다고 상상해보십시오.

hg qimport -r 498:tip
hg qpop -a
joe .hg/patches/498.diff
(change the comment, after the mercurial header)
hg qpush -a
hg qdelete -r qbase:qtip

좋은 소식 : HG 2.2 방금 추가했습니다 git 좋아요 --amend 옵션.

그리고 Tortoisehg에서는 커밋 버튼 오른쪽에서 검은 색 화살표를 선택하여 "현재 개정 수정"을 사용할 수 있습니다.

a

나는 이것이 오래된 게시물이라는 것을 알고 있습니다. 그리고 당신은 대답대로 질문을 표시했습니다. 나는 최근에 같은 것을 찾고 있었고 나는 histedit 확장 매우 유용합니다. 프로세스는 여기에 설명되어 있습니다.

http://knowledgestockpile.blogspot.com/2010/12/changing-commit-message-of-revision-in.html

마지막 작전은 문제의 커밋이었습니다

마지막 수은 작전이 당신이 사용할 수있는 커밋 일 때 마지막 커밋의 커밋 메시지를 변경하려면

$ hg rollback

마지막 커밋을 롤백하고 새 메시지로 다시 커밋하려면 다음과 같습니다.

$ hg ci -m 'new message'

그러나 롤백 명령은 작업에 따라 롤백하기 때문에주의하십시오.

  • 수입
    • 당기다
    • 푸시 (이 저장소와 함께 대상으로)
    • 번들

(보다 hg help rollback)

따라서 마지막 수은 명령이 hg ci, 사용하지 마십시오 hg rollback.

다른 커밋 메시지를 변경하십시오

당신은 사용할 수 있습니다 MQ 확장, Mercurial과 함께 배포되어 모든 커밋의 커밋 메시지를 변경합니다.

이 접근법은 대중에게 클로닝 된 저장소가 없을 때만 유용합니다.

즉, 이름을 바꾸려는 변경 사항이 포함 된 모든 기존의 클론을 제거하거나 다른 클론을 제거 할 수 있어야합니다.

MQ 확장을 사용하려면 명시 적으로 활성화해야합니다. 예를 들어 UNIX에서 확인하십시오. ~/.hgrc, 다음 선이 포함되어야합니다.

[extensions]
mq=

개정 X를 변경하고 싶다고 말하십시오 - 먼저 qimport 수정 x 및 다음을 가져옵니다. 이제 응용 패치 스택으로 등록됩니다. 터지는 (qpop) X를 제외한 전체 스택은 X를 통해 변경에 사용할 수있게합니다. qrefresh. 커밋 메시지가 변경되면 모든 패치를 다시 밀어야합니다 (qpop) 다시 적용하려면 다음과 같은 개정을 재현합니다. 패치 스택은 필요하지 않으므로 qfinish.

다음과 같은 데모 스크립트에는 모든 작업이 작동하는 것으로 표시됩니다. 예에서는 세 번째 변경 사항의 커밋 메시지의 이름이 바뀌 었습니다.

# test.sh
set -x -e -u
echo INFO: Delete old stuff
rm -rf .hg `seq 5`
echo INFO: Setup repository with 5 revisions
hg init
echo '[ui]' > .hg/hgrc
echo 'username=Joe User <juser@example.org>' >> .hg/hgrc
echo 'style = compact' >> .hg/hgrc
for i in `seq 5`; do
  touch $i && hg add $i && hg ci -m "changeset message $i" $i
done
hg log 
echo INFO: Need to rename the commit message or the 3rd revision
echo INFO: Displays all patches
hg qseries
echo INFO: Import all revisions including the 3rd to the last one as patches
hg qimport -r 2:tip
hg qseries
echo INFO: Pop patches
hg qpop 2.diff
hg qseries
hg log 
hg parent
hg qrefresh -m 'CHANGED MESSAGE'
hg log 
echo INFO: Push all remaining patches
hg qpush -a
hg log 
hg qseries
echo INFO: Remove all patches
hg qfinish -a
hg qseries && hg log && hg parent

빈 디렉토리로 복사하십시오.

$ bash test.sh 2>&1 | tee log

출력에는 원래 Changeet 메시지가 포함되어야합니다.

+ hg log
[..]
2   53bc13f21b04   2011-08-31 17:26 +0200   juser
  changeset message 3

변경된 메시지 이름 바뀌 었습니다.

+ hg log
[..]
2   3ff8a832d057   2011-08-31 17:26 +0200   juser
  CHANGED MESSAGE

(수은 1.7.5로 테스트)

Tortoisehg에서 수정하려는 개정을 마우스 오른쪽 단추로 클릭하십시오. 히스토리 수정을 선택하십시오-> MQ 가져 오기. 이는 모든 수정 사항을 수은 변경 사항에서 수은 큐 패치로 포함하여 모든 개정판을 전환합니다. 메시지를 수정하려는 패치를 선택하면 화면을 MQ 편집기로 자동 변경해야합니다. 화면 중간에있는 메시지를 편집 한 다음 Qrefresh를 클릭하십시오. 마지막으로 패치를 마우스 오른쪽 버튼으로 클릭하고 히스토리를 수정-> 마감 패치를 선택하면 패치에서 다시 변경 세트로 변환됩니다.

오, 이것은 MQ 가이 저장소에서 Tortoisehg의 활성 확장이라고 가정합니다. 그렇지 않은 경우 파일> 설정을 클릭하고 확장자를 클릭하고 MQ 확인란을 클릭 할 수 있어야합니다. 확장이 활성화되기 전에 Tortoisehg를 닫아야한다고 경고해야합니다.

다른 사람들이 언급했듯이 MQ 확장은이 작업에 훨씬 더 적합하며 작업을 파괴 할 위험이 없습니다. 이것을하기 위해:

  1. HGRC에 이와 같은 것을 추가하여 MQ 확장을 활성화하십시오.
    [extensions]
    mq =
    
  2. 편집하려는 변경 사항에 대한 업데이트, 일반적으로 팁 :
    hg up <rev>
    
  3. 현재 변경 사항을 큐로 가져옵니다.
    hg qimport -r .
    
  4. 패치를 새로 고치고 커밋 메시지를 편집하십시오.
    hg qrefresh -e
    
  5. 적용된 모든 패치 (이 경우 하나)를 완료하고 일반 변경 사항으로 저장하십시오.
    hg qfinish -a
    

나는 Tortoisehg에 익숙하지 않지만 명령은 위의 명령과 비슷해야합니다. 또한 편집 이력이 위험하다는 것을 언급 할 가치가 있다고 생각합니다. 당신은 당신이하는 경우에만해야합니다 물론 변경 사항이 다른 곳으로 밀거나 당겨지지 않았 음을 확인합니다.

롤백 앤 라이프 플라이는 정말 간단한 솔루션이지만 마지막 커밋에만 도움이 될 수 있습니다. Mercurial Deues는 훨씬 더 강력한 것입니다 ( 수은 큐 확장을 활성화합니다 "hg q*"명령을 사용하려면).

나는 이런 식으로했다. 첫째, 변경 사항을 넓히지 마십시오. 그렇지 않으면 운이 좋지 않습니다. 잡고 설치하십시오 무너지다 확대. 또 다른 더미 변경 사항을 저장하십시오. 그런 다음 붕괴를 사용하여 이전 두 개의 변경 사항을 하나로 결합하십시오. 새로운 커밋 메시지를 보내 주시면 이미 시작점으로 보유한 메시지를 제공합니다. 원래 커밋 메시지를 효과적으로 변경했습니다.

편집하고 싶은 개정이 그리 오래되지 않은 경우 사용하는 한 가지 해킹.

REV 500이고 497을 편집하고 싶다고 가정 해 봅시다.

hg export -o rev497 497
hg export -o rev498 498
hg export -o rev499 499
hg export -o rev500 500

Rev497 파일을 편집하고 메시지를 변경하십시오. (첫 번째 줄이 "#"이후입니다)

hg import rev497
hg import rev498
hg import rev499
hg import rev500

MQ 확장 및 디버그 명령. 이것은 데이터를 잃지 않고 기록을 수정하는 일반적인 방법입니다. 같은 상황을 가정하겠습니다 안토니오.

// set current tip to rev 497
hg debugsetparents 497
hg debugrebuildstate
// hg add/remove if needed
hg commit
hg strip [-n] 498

위의 토론에서 약간의 보석 - @codest와 @kevin pullin 덕분입니다. Tortoisehg에는 커밋 버튼에 인접한 드롭 다운 옵션이 있습니다. "현재 개정 수정"을 선택하면 주석과 파일 목록이 다시 나타납니다. 너무 유용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top