我们发现汞储藏库在数周前已损坏。这种破坏似乎已经蔓延:所有克隆(中央存储库和用户存储库)都以同样的方式被破坏,非常严重。我认为,如果我们那时进行验证,我们可以阻止它。
是否有一些汞设置会在每次推送时引起验证,并在验证失败的情况下阻止推送?我知道我可以将其实现为Python中的钩子,但是也许有一个更简单的解决方案?
是否还可以做相反的事情:在拉动之前确保已验证远程存储库?
FWIW,我在Windows 10上,我们正在使用TortoiseHg。
更新:我尝试按照Jordi的建议创建钩子。 Hg现在挂起,等待锁。这是我看到的:
c:\Users\username\test-hook>hg init
c:\Users\username\test-hook>cd ..
c:\Users\username>hg clone test-hook test-hook-clone
updating to branch default
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
# At this point I edited clone repository settings to include
# [hooks]
# preoutgoing = hg verify
#
# Then I created a test.txt file and "added" it via TortoiseHg context menu.
c:\Users\username\test-hook-clone>hg commit
c:\Users\username\test-hook-clone>hg status
c:\Users\username\test-hook-clone>hg outgoing
comparing with c:\Users\username\test-hook
searching for changes
changeset: 0:a61d33af6cdb
tag: tip
user: username
date: Mon May 06 20:32:54 2019 +0200
summary: test file added
c:\Users\username\test-hook-clone>hg push -verbose
pushing to c:\Users\username\test-hook
searching for changes
running hook preoutgoing: hg verify
waiting for lock on repository c:\Users\username\test-hook-clone held by process '16840' on host 'LT407233'
答案 0 :(得分:4)
要回答您的问题,该挂钩不必使用Python编写。在相应服务器的hgrc
中(在存储库级别或系统级别),只需设置
[hooks]
preoutgoing = hg verify
preincoming = hg verify
这可能会显着降低所有拉入和推入操作的速度,但是也许您愿意为了正确而牺牲速度。
当客户端尝试从损坏的存储库中提取时,这将导致如下输出:
$ hg clone http://localhost:9000 sample-repo
requesting all changes
remote: abort: preoutgoing hook exited with status 1
,并且在服务器日志中,您应该会看到类似于
的输出127.0.0.1 - - [18/Apr/2019 12:41:09] "GET /?cmd=batch HTTP/1.1" 200 - x-hgarg-1:cmds=lheads+%3Bknown+nodes%3D x-hgproto-1:0.1 0.2 comp=zstd,zlib,none,bzip2 partial-pull
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
a@0: broken revlog! (index data/a.i is corrupted)
warning: orphan data file 'data/a.i'
checked 2 changesets with 1 changes to 2 files
1 warnings encountered!
1 integrity errors encountered!
(first damaged changeset appears to be 0)
答案 1 :(得分:0)
您可以启用服务器端选项以对所有传入内容执行更多验证,只需在服务器上设置server.validate=yes
选项即可。
最简单的方法是通过添加以下两行在服务器全局hgrc
或存储库.hg/hgrc
文件中启用它:
[server]
validate = yes
这是一个服务器选项,但您也可以在客户端上使用它。它也应该验证拉力。
(顺便问一下,您看到的是哪种腐败?)