Mercurial 저장소 손상


14

이것은 이 질문 과 다소 관련 있지만 다른 질문입니다.

SSH 및 mercurial-server 를 통해 사용자에게 제공되는 중앙 Hg 저장소가 있습니다. 많은 Mac, Linux 및 Windows 클라이언트가 연결되어 있습니다.

Windows 사용자 중 하나가 저장소를 손상시킨 다음 중앙 저장소로 다시 밀어 넣어 두 번 발생했습니다. 중앙 리포지토리가 손상 될 경우 트랜잭션이 수락되지 않도록 중앙 리포지토리에 들어오는 후크 스크립트를 작성하려고합니다.

불행히도 나는 Mercurial이 그러한 스크립트를 작성하기에 충분하지 않습니다. 다른 사람이이 문제를 겪었을 가능성이 있습니까? 개인적으로 나는 왜 hg가 기본적으로 이것을하지 않는지 잘 모르겠습니다.


여기에서 해결책을 찾았습니다 : davidherron.com/blog/topics/… 모든 클라이언트에서 수행해야합니다. 그러나 중앙 리포지토리를 위해 할 수있는 더 나은 솔루션을 가진 사람이 있다면 더 좋습니다.
bobinabottle 2009

자세한 내용을 알려주십시오 : 서버와 각 클라이언트에서 어떤 버전의 Mercurial을 사용하고 있습니까?
Martin Geisler

2
또한 이것을 재현 할 수 있다면 우리 (Mercurial 개발자)에게 매우 유용 할 것입니다. : 또한 우리에게 직접 우리의 메일 링리스트를 통해 문제를 신고 해주세요 mercurial.selenic.com/wiki/MailingLists 또는 버그 추적기 : selenic.com/mercurial/bts을 훨씬 더 생산적인 :-) 여기에 게시보다 그
마틴 가이슬러

답변:


4

최신 버전의 Mercurial (1.5 이후)은 수신 데이터의 유효성 검사를 지원합니다. 더하다

[server]
validate = True

서버가 .hg/hgrc들어오는 데이터를 확인하고 유효하지 않은 푸시를 거부하도록 서버의 hg 구성 ( 또는 hgwebdir 구성이 제대로 작동해야 함)에 연결하십시오. 그러면 클라이언트는 다음과 유사한 오류를 보게됩니다.

remote: abort: missing file data for beta:dddc47b3ba30e54484720ce0f4f768a0f4b6efb9 - run hg verify

희망이 도움이됩니다!


2

어쩌면 저장소로 밀지 않아야합니다. Mercurial과 그 분산 된 특성으로 모든 사람이 지사를 가질 수 있으며 그들이 준비되었다고 느낄 때 그들은 당신에게 말하고 당신은 그들로부터 끌어냅니다. 커밋-액세스 문제도없고, 밀어 붙임도 없어서 ...

이것은 SVN에서 Mercurial로 마이그레이션 할 때 내 친구가 내게 준 조언입니다.

나는 이것이 당신에게 옵션 일지 모르겠지만, 모든 사람들을 위해 개인 저장소를 설정 한 다음 위험한 사람들을 잡으려고 노력하는 것보다 적은 노력이 필요할 수 있습니다.


HG를 추진하지 않으면 전체 사용자의 목적이
Anonymouse

0

David Herron의 블로그 와 동일한 작업 을 수행 할 수는 없지만 사전 라우팅에서 수행하는 대신 중앙 저장소의 사전 커밋 후크에서 수행합니까?


Nope :-( 시도했지만 교착 상태가 발생했습니다. 클라이언트가 푸시하려고하면 저장소에 대한 잠금을 예약합니다. 'hg verify'를 실행하면 잠금이 필요하므로 영원히 대기합니다. 끝없는 루프
bobinabottle 2009

또한 이것이 사전 커밋에서 작동하더라도 리포지토리를 확인하고 정상인지 확인한 다음 손상을 일으키는 변경 사항을 커밋합니다. 실제로 트랜잭션을 롤백하는 경우 들어오는 변경으로 인해 repos가 손상되는지 여부를 평가하는 후크가 필요합니다. 따라서 changegroup hook에있는 것이 더 합리적입니다.
bobinabottle 2009

합니다 (changegroup 후크를 사용하는 것은 여전히 교착 결과)
bobinabottle

흥미있는-후크는 파이썬 기반 인 것 같습니다. 저장소를 손상시키는 것이 무엇인지 알고 있습니까? 매번 같은 것입니까?
Ryan Gibbons

0

가능한 대안은 다음과 같습니다.

  1. 푸시 후 저장소를 복제하십시오.
  2. 그것을 확인하십시오.
  3. 저장소가 양호하면 최신 저장소로 보관하십시오.
  4. 리포지토리가 손상된 경우 경보를 발생시킵니다
  5. 경보가 발생하면 가장 최근에 알려진 올바른 저장소를 복원하십시오.

이 솔루션은 필요한 것이 아니지만 최소한 손상이 발생한 경우 리포지토리를 롤백 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.