【问题标题】:Why does hg merge keep two copies of a moved file?为什么 hg merge 保留移动文件的两个副本?
【发布时间】:2013-07-01 20:51:10
【问题描述】:

在将一堆文件移动到不同文件夹后合并两个分支时,我得到了一个奇怪的结果。例如,最初我在main 分支的根目录中:

(main)
|-run.py

我创建了一个新分支(moves),在其中我移动了很多文件(使用hg mv):

(moves)
|-bin/
   |-run.py

在合并两个分支 (hg up main && hg merge moves) 时,我得到了一个意想不到的结果(至少对我而言)。基本上相同的文件出现在两个位置的main 分支中:

(main)
|-run.py
|-bin/
   |-run.py

如果我在简化测试中这样做,我会得到我期望的结果:

hg init test
cd test
touch file_a
hg add file_a
hg ci -m 'added file_a'
hg branch movement
mkdir files
hg mv file_a files
hg ci -m 'moved file_a'
hg up default

此时ls 显示单个文件file_a

(default)
|-file_a

在合并hg merge movement 之后,正如我所料,file_a 位于文件夹 files 中,而不再位于根目录中。

(default)
|-files/
   |-file_a

我在试图弄清楚为什么我的真实存储库没有得到相同的结果时迷失了方向。

更新

挖掘 mercurial 日志并查看发生了什么变化:

>hg status --change 457  -C
A bin/run.py
  run.py
R run.py

所以在我看来,文件已被移动并且已注册。合并后,当两个文件都存在时,我只能在主目录中获取run.py 的日志(hg log -f)。对于bin/run.py,它会打印:abort: cannot follow file not in parent revision: "bin/run.py"。但是,在我提交合并后,hg log -f 对这两个文件都有效。

【问题讨论】:

    标签: mercurial merge


    【解决方案1】:

    正如您的简化测试表明这不是正确的行为。 我会检查 move 分支中 run.py 文件的修订历史,看看它是否有它被移动的信息。

    【讨论】:

    • 在上面添加了一些日志信息。
    • 真的很奇怪。比较两个文件的 hg log 命令输出时,你能看到一些奇怪的东西吗?
    • 唯一的区别是,当我重命名文件时,原始 run.py 的日志会回到修订版。对于 bin/run.py,它还显示了移动后所做的更改。看起来文件以某种方式被复制了,尽管 Mercurial 已经注册了移动它的东西,但文件是分开的。我已经制作了存储库的干净副本并开始了一个新的存储库。不能在这上面浪费太多时间。感谢您的意见!
    【解决方案2】:

    最新的 Mercurial 版本 (2.7) 解决了我的问题。可能是由this bug 引起的。

    【讨论】:

      猜你喜欢
      • 2020-01-18
      • 2021-06-14
      • 2021-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      相关资源
      最近更新 更多