1

不久前,我注意到当我在分支之间更新时,hg 在看似随机的时间开始在存储库中创建未版本化的文件副本。我这辈子都想不出我可能会改变什么来让这种情况开始发生。详细或跟踪输出中没有任何内容表明正在创建这些文件。

新的未版本化文件名都以添加到扩展名末尾的随机字符串结尾:

file1.txt-23121dd1  
someotherfile.sql-bc769bd2  
bizarrofile.cs-40a93ed0
hgisinvadingurhead.ppt-f8e9015a

在试图确定这种情况发生的模式时,我注意到以下几点:

  • 文件名中添加的字符与存储库中的任何变更集 ID 都不对应。我已经完成了grep -i输出,hg history并且文件名中的字符串没有出现在输出中的任何位置。
  • 在所有情况下,文件都存在于我正在处理的分支中,但不存在于我更新到的分支中。
  • 有时只有一两个文件,有时是几个。
  • 绝不是这些文件都存在于一个分支中而不是另一个分支中。
  • 更新之间永远不会是同一组未版本化的文件。
  • 我团队中正在克隆相同存储库的其他人似乎没有遇到这种情况

我想这可能是存储库中的某些东西,但它也发生在其他现有的存储库和全新的存储库中。

例如,我已经这样做了(除了最后的 hg status 输出之外,省略了 hg 输出,但输出没有错误):

c:\> mkdir repo
c:\> cd repo
c:\repo\> hg init
c:\repo\> echo default > default.txt
c:\repo\> hg add
c:\repo\> hg commit -m "Commit default"
c:\repo\> hg branch branch1
c:\repo\> echo branch1 > branch1.txt
c:\repo\> hg add
c:\repo\> hg commit -m "Commit branch1"
c:\repo\> hg update default
c:\repo\> hg status
? branch1.txt-23121dd1

这不是每次都可以重复的。我可以重复这些步骤,有时未版本化的文件会在最后出现,有时不会。这是非常零星的。但是,在较大的存储库中,我几乎总是在分支更新之间看到至少一个未版本控制的文件。

以下的完整输出hg update default。无论是否创建了未版本化的文件,输出始终如此显示。

resolving manifests
calling hook preupdate.eol: <function preupdate at 0x0000000002571668>
removing branch1.txt
0 files updated, 0 files merged, 1 files removed, 0 files unresolved

当我第一次注意到它时,我使用的是旧版本的 hg,但更新到 2.3.2 后问题仍然存在。我正在使用带有 TortoiseHG 2.5.1 x64 的 Windows 7 Pro x64。但是,我认为它与 Tortoise 无关,因为我可以通过在命令行中使用 hg 来复制问题。

我的 mercurial.ini 文件的内容是:

[ui]
username=myname <myname@mydomain.com>
ignore=C:\users\myusername\.hgignore
verbose=true
trace=true

[eol]
native = CRLF
only-consistent = False

[extensions]
purge =
eol =

我可以忍受它,但要确保我不会意外地将这些文件添加到带有其他新文件的变更集中的存储库中,这很痛苦。

如果有人看到了这一点并且可以指出我的罪魁祸首,我将不胜感激!

4

2 回答 2

0

如果在变更集之间更新时文件正在使用中,则使用中的文件将使用添加的数字重命名,以便更新成功。

于 2012-10-16T20:26:21.213 回答
0

禁用eol扩展有帮助吗?我注意到您的测试也没有使用.hgeol文件(这是与此扩展相关的事情之一)。这里有另一个线程专门解决此扩展的一些问题。

于 2012-10-17T04:56:55.917 回答