【发布时间】:2012-10-16 18:25:02
【问题描述】:
不久前,当我在分支之间更新时,我注意到 hg 在看似随机的时间开始在存储库中创建文件的未版本控制副本。我这辈子都想不出我可能会改变什么来让这种情况开始发生。详细或跟踪输出中没有任何内容表明正在创建这些文件。
新的未版本化文件名都以似乎是添加到扩展名末尾的随机字符串结尾:
file1.txt-23121dd1
someotherfile.sql-bc769bd2
bizarrofile.cs-40a93ed0
hgisinvadingurhead.ppt-f8e9015a
在尝试确定这种情况发生的模式时,我注意到以下几点:
- 文件名中添加的字符与存储库中的任何变更集 ID 不对应。我对
hg history的输出做了一个grep -i并且文件名中的字符串没有出现在输出中的任何位置。 - 在所有情况下,文件都存在于我正在处理的分支中,但不存在于我更新到的分支中。
- 有时只有一两个文件,有时是多个。
- 决不是所有文件都存在于一个分支而不是另一个分支中。
- 更新之间绝不会是同一组未版本化的文件。
- 我团队中正在克隆相同存储库的其他人似乎没有遇到这种情况
我认为这可能是存储库中的某些东西,但它也发生在其他现有存储库以及全新的存储库中。
例如,我已经这样做了(hg输出除了最后的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 =
我可以忍受它,但是要确保我不会意外地将这些文件添加到与其他新文件一起的变更集中的存储库中。
如果有人看到了这个并且可以指出我的罪魁祸首,我会非常感激!
【问题讨论】:
-
请显示
hg up default的完整输出 -
@Lazy 我已经对其进行了编辑。如果这不是您想要的,请告诉我。谢谢!
-
好的,文件被删除(正如我在我的案例中看到的那样)。我现在只能怀疑更新前的钩子和它的副作用-我没有任何钩子(更新时遇到麻烦)
-
我遇到了同样的问题。我会通过切换分支甚至重命名文件来获得它。