4

我的困惑,当标志混乱源于下面的语句taken from here冲突拉动已删除的文件用的darcs

当拉动补丁相互冲突(例如,更改文件的同一部分)的darcs检测到冲突并将其标记在存储库内容中。然后它让用户解决问题。

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

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

采取这些步骤后,我跑了吧darcs whatsnew,显示出两个“补丁原语”:

  1. 一大块删除所有“foo中的非空文件”,但没有提到添加并记录在栏中的行;
  2. 删除文件的rmfile。

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

如果我跑在酒吧darcs revert,那么一切都有道理:我看“非空文件”受既不冲突的修补程序,按照这种说法taken from here

的darcs恢复该命令将删除冲突标记并在冲突补丁之前备份。

不过,如果我跑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 [email protected] 
    * 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 
+0

虽然测试这个,我发现了一个错误,因为在拉出冲突的补丁之后尝试'在'还原'之前'标记冲突'。我[为它创建了一个bug](http://bugs.darcs.net/issue2104)。 – dukedave

回答

7

如果你运行darcs changes -v里面吧,你会看到你的 变化的历史,其中包括由于您拉动 相冲突的修补程序而导致冲突问题。

我总结你的榜样的东西everso稍短:

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 

现在,在这之后,我看到darcs changes -v

Tue Nov 15 19:44:38 GMT 2011 Owen Stephens <[email protected]> 
    * 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 <[email protected]> 
    * Change myfile 
    hunk ./myfile 2 
    +b 

Tue Nov 15 19:44:38 GMT 2011 Owen Stephens <[email protected]> 
    * Add myfile 
    addfile ./myfile 
    hunk ./myfile 1 
    +a 

所以这个输出,让我们解释的“疯狂输出删除myfile“。 “删除文件MyFile”存在 如FOO以下:

Tue Nov 15 19:44:38 GMT 2011 Owen Stephens <[email protected]> 
    * Remove myfile 
    hunk ./myfile 1 
    -a 
    rmfile ./myfile 

所以,位于第1行和移除该文件的一大块。

将“删除myfile”拉入栏中,我们通过引入特殊的“冲突”原语来修改补丁内容,这些原语代表了“删除我的文件”中与其他原始文件相冲突的原语。注:这里没有信息丢失 - 我们总是可以通过取消冲突更改来恢复原始原语 - 在这种情况下,可以取消“更改myfile”。

Conflictors是混乱,但AFAICT基本上单独的更改 冲突与当前补丁,X为2台: “IX”,它是包括补丁集: ⅰ)修补x和一些其他冲突补丁与补丁相冲突的补丁与x “xx”冲突,该补丁是仅与补丁x冲突的补丁序列。 我认为这样做的原因是冲突者具有 “撤销”引起冲突的原语的效果,但只有那些未被另一个冲突器取消的原语。

我们看到的输出是一样的东西:

"conflictor" ix "[" xx "]" x 

我滥用符号,但希望你能有所破译(见 的src /的darcs /补丁/ V2 /(Real.hs |非。 hs)在darcs.net回购中的全文)

在这种情况下,“删除myfile”有2个原始补丁,并且(在这种情况下)当被拉入到相应的冲突中时。

第一原语(删除MYFILE线1)只与 原始的 “更改文件MyFile” 内部的冲突(添加 'B' 到线路MYFILE的2)和所以这是 第一conflictor:

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

NB(“|:”是界定从 原始本身就是一个“非” primitve的上下文的标志 - 我不会尝试,并进一步解释,下面只是阅读|:到 看到原始的问题)

第二个基元(删除myfile)只是稍微更复杂因为我们知道冲突 与(删除myfile中的第1行),所以他们都进入“ix”,没有补丁 “(文件 myfile)冲突与(添加'b'到myfile的第2行) XX”。我会删除不必要的“|”分隔符和空间的事情了:

conflictor {{ 

hunk ./myfile 2 
+b 

hunk ./myfile 1 
-a 

}} 
[]    <--- no xx 

|hunk ./myfile 1 <--- start of x 
|-a 
|: 
rmfile ./myfile <--- end of x 

最后(rmfile MYFILE)具有一定的上下文indentify是我们指的是确切的原始 (我不是真的确定为什么/如何这是必需的,但我们在那里是 ),它由领先的'|'标记并用“|:”分隔。

最后,试图解释foo中darcs whatsnew的输出;当 多个补丁发生冲突时,我认为冲突者的实际效果是 “撤消”任何冲突的补丁,并不产生效果; 给出了一些解释的开始:http://en.wikibooks.org/wiki/Understanding_Darcs/Patch_theory_and_conflicts

我想你所看到的是“Change myfile”和“Remove myfile”的强制换向的结果,分别称它们为AB。然后合并两个,创造的darcs和A^-1通勤A^-1BB'(A^-1)'其中B'A^-1效果(因为我们强迫换工作),这意味着的B'(效果即合并后的“删除myfile“)实际上就是撤消添加”Change myfile“所做的行。

我没有时间看darcs mark-conflicts是如何工作的,所以我还无法解释您在darcs changes中看到的工作变化。

+0

非常感谢您的回答,不幸的是,我对您在以_开头的段落中的措词感到困惑 - “冲突者很容易混淆”(适当地)。 如果你有时间可以尝试重新措辞吗? – dukedave