使用darcs删除已删除文件时的冲突标记混淆

duk*_*ave 4 version-control haskell dvcs darcs merge-conflict-resolution

我的混淆来自于此处的以下声明:

当拉出彼此冲突的补丁(例如,更改文件的相同部分)时,Darc会检测冲突并将其标记在存储库内容中.然后,它允许用户解决问题.

这似乎与我所看到的不一致,因此我使用darcs 2.5.2创建了以下工作流程:

  1. 创建repo foo;
  2. 在foo中创建一个非空文件并记录它;
  3. 克隆foo到酒吧;
  4. 删除foo中的文件并记录下来;
  5. 在bar中的文件中添加另一行并记录它;
  6. 从foo拉到酒吧,获取冲突通知;

在执行这些步骤之后,我darcs whatsnew在bar中运行,并显示了两个"补丁原语":

  1. 一个大块移除了所有"foo中的非空文件",但没有提到添加和记录在栏中的行;
  2. 删除文件的rmfile.

我的问题是:为什么没有提到在栏中添加和记录的行?

如果我darcs revert在bar中运行,那么一切都有意义:我看到"非空文件"受到两个冲突补丁的影响,根据此处的说法:

命令darcs revert将删除冲突标记并在冲突补丁之前恢复到状态.

但是如果我运行的话,我会darcs mark-conflicts回到拉动之后的状态,使用上面提到的两个"补丁基元",并且没有提到添加并记录在条形中的行.


对于参考/再现,这是我从命令行完成的工作流程:

$ mkdir foo
$ cd foo/
foo$ darcs initialize

foo$ touch shopping
foo$ vi shopping          <-- add a couple of lines
foo$ darcs add shopping

foo$ darcs record 
addfile ./shopping
Shall I record this change? (1/2)  [ynW...], or ? for more options: y
hunk ./shopping 1
+cake
+pie
Shall I record this change? (2/2)  [ynW...], or ? for more options: y
What is the patch name? Added shopping
Do you want to add a long comment? [yn]n
Finished recording patch 'Added shopping'

foo$ cd ..
$ darcs get foo/ bar
$ cd bar/

bar$ vi shopping    <-- add another line
bar$ darcs record 
hunk ./shopping 2
+beer
Shall I record this change? (1/1)  [ynW...], or ? for more options: y
What is the patch name? Added beer
Do you want to add a long comment? [yn]n
Finished recording patch 'Added beer'

bar$ cd ../foo
foo$ rm shopping 
foo$ darcs record 
hunk ./shopping 1
-cake
-pie
Shall I record this change? (1/2)  [ynW...], or ? for more options: y
rmfile ./shopping
Shall I record this change? (2/2)  [ynW...], or ? for more options: y
What is the patch name? Removed shopping
Do you want to add a long comment? [yn]n
Finished recording patch 'Removed shopping'

foo$ cd ../bar
bar$ darcs pull
Pulling from "../foo"...
Mon Nov 14 19:26:44 GMT 2011  dukedave@gmail.com
  * Removed shopping
Shall I pull this patch? (1/1)  [ynW...], or ? for more options: y
Backing up ./shopping(-darcs-backup0)
We have conflicts in the following files:
./shopping
Finished pulling and applying.

bar$ darcs whatsnew 
hunk ./shopping 1
-cake
-pie
rmfile ./shopping
Run Code Online (Sandbox Code Playgroud)

ows*_*wst 7

如果您darcs changes -v在栏内运行,您将看到更改的历史记录,包括因拉动冲突补丁而引入的冲突者.

我把你的例子总结为略微缩短的东西:

DARCS=/usr/bin/darcs

$DARCS init --repo foo
cd foo

echo 'a' > myfile
$DARCS add myfile && $DARCS record -am 'Add myfile'

$DARCS get . ../bar

rm myfile
$DARCS record -am 'Remove myfile'

cd ../bar

echo 'b' >> myfile
$DARCS record -am 'Change myfile'

$DARCS pull -a ../foo

$DARCS changes -v
Run Code Online (Sandbox Code Playgroud)

现在,在那之后,我看到了这个输出 darcs changes -v

Tue Nov 15 19:44:38 GMT 2011  Owen Stephens <darcs@owenstephens.co.uk>
  * Remove myfile
    conflictor [
    hunk ./myfile 2
    +b
    ]
    |:
    hunk ./myfile 1
    -a
    conflictor {{
    |:
    hunk ./myfile 2
    +b
    |:
    hunk ./myfile 1
    -a
    }} []
    |hunk ./myfile 1
    |-a
    |:
    rmfile ./myfile

Tue Nov 15 19:44:38 GMT 2011  Owen Stephens <darcs@owenstephens.co.uk>
  * Change myfile
    hunk ./myfile 2
    +b

Tue Nov 15 19:44:38 GMT 2011  Owen Stephens <darcs@owenstephens.co.uk>
  * Add myfile
    addfile ./myfile
    hunk ./myfile 1
    +a
Run Code Online (Sandbox Code Playgroud)

那么,让我们来解释一下"删除myfile"的疯狂输出.foo中存在以下内容:"删除myfile":

Tue Nov 15 19:44:38 GMT 2011  Owen Stephens <darcs@owenstephens.co.uk>
  * Remove myfile
    hunk ./myfile 1
    -a
    rmfile ./myfile
Run Code Online (Sandbox Code Playgroud)

所以,第1行的一个大块并删除了该文件.

将"删除myfile"拉入栏中,我们通过引入特殊的"conflicttor"原语来修改补丁内容,这些原语表示"删除myfile"中与"bar"中其他原语冲突的原语.Nb这里没有信息丢失 - 我们总是可以通过取消冲突的变化来回到原始原语 - 在这种情况下,取消对"更改myfile"的删除.

冲突者感到困惑,但AFAICT基本上将与当前补丁相冲突的变化分为两组:"ix",这是一组补丁,包括:i)与x冲突的补丁和回购中的其他补丁ii)补丁与与x"xx"冲突的补丁发生冲突,x"xx"是仅与补丁x冲突的补丁序列.我认为这样做的原因是,冲突者具有"撤销"导致冲突的原语的作用,但只有那些未被另一个冲突者撤消的原语.

我们看到的输出是这样的:

"conflictor" ix "[" xx "]" x
Run Code Online (Sandbox Code Playgroud)

我正在滥用符号,但希望你能解读一下(请参阅darcs.net repo中的src/Darcs/Patch/V2 /(Real.hs | Non.hs)以获取完整的故事)

在这种情况下,"删除myfile"有2个原始补丁,并且(在这种情况下)拉入条形时有2个相应的冲突器.

第一个原语(从myfile中删除第1行)只与"更改myfile"中的原语冲突(将'b'添加到myfile的第2行),这是第一个冲突者:

conflictor [    <--- The start of xx (no ix here)
hunk ./myfile 2
+b
]               <--- The end of xx
|:
hunk ./myfile 1 <--- x
-a
Run Code Online (Sandbox Code Playgroud)

NB("|:"是一个标记,它从原始本身界定"非"原始的上下文 - 我不会尝试进一步解释它,只需阅读下面的|:来查看有问题的原语)

第二个原语(删除myfile)只是稍微复杂一些:(rmfile myfile)与(在myfile的第2行添加'b')冲突,我们知道它与myfile中的第1行相冲突,所以它们都进入" ix","xx"中没有补丁.我将删除不必要的"|:"分隔符和空格:

conflictor {{

hunk ./myfile 2
+b

hunk ./myfile 1
-a

}} 
[]               <--- no xx

|hunk ./myfile 1 <--- start of x
|-a
|:
rmfile ./myfile  <--- end of x
Run Code Online (Sandbox Code Playgroud)

最后的(rmfile myfile)有一些上下文来识别我们所指的确切原语(我不确定为什么/如何这是必需的,但我们有),它由前导'|'和由"|:"分隔.

最后,尝试解释darcs whatsnewfoo 的输出; 当多个补丁冲突时,我认为冲突者的实际效果是"撤消"任何冲突的补丁,不会产生任何效果; 给出了一些解释的开头:http://en.wikibooks.org/wiki/Understanding_Darcs/Patch_theory_and_conflicts.

我想你现在看到的是"改变MYFILE"和"删除文件MyFile"称呼他们的强迫换流的结果A,并B分别.然后合并这两个,Darcs创建A^-1和通勤,A^-1B给予B'(A^-1)'在哪里B'有效果A^-1(因为我们迫使换向工作),这意味着B'(即合并的"删除myfile")的效果实际上只是撤消添加"更改myfile"所做的行.

我没有时间看看它是如何darcs mark-conflicts工作的,所以我还不能解释你darcs changes在酒吧看到的工作变化.