Mercurial에서 잘못된 커밋 메시지를 편집하는 방법은 무엇입니까? [복제하다
-
05-07-2019 - |
문제
이 질문은 이미 여기에 답이 있습니다.
나는 현재 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에서는 커밋 버튼 오른쪽에서 검은 색 화살표를 선택하여 "현재 개정 수정"을 사용할 수 있습니다.
나는 이것이 오래된 게시물이라는 것을 알고 있습니다. 그리고 당신은 대답대로 질문을 표시했습니다. 나는 최근에 같은 것을 찾고 있었고 나는 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 확장은이 작업에 훨씬 더 적합하며 작업을 파괴 할 위험이 없습니다. 이것을하기 위해:
- HGRC에 이와 같은 것을 추가하여 MQ 확장을 활성화하십시오.
[extensions] mq =
- 편집하려는 변경 사항에 대한 업데이트, 일반적으로 팁 :
hg up <rev>
- 현재 변경 사항을 큐로 가져옵니다.
hg qimport -r .
- 패치를 새로 고치고 커밋 메시지를 편집하십시오.
hg qrefresh -e
- 적용된 모든 패치 (이 경우 하나)를 완료하고 일반 변경 사항으로 저장하십시오.
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
위의 토론에서 약간의 보석 - @codest와 @kevin pullin 덕분입니다. Tortoisehg에는 커밋 버튼에 인접한 드롭 다운 옵션이 있습니다. "현재 개정 수정"을 선택하면 주석과 파일 목록이 다시 나타납니다. 너무 유용합니다.