gpt4 book ai didi

version-control - 使用 darcs 拉取已删除文件时出现冲突标记混淆

转载 作者:行者123 更新时间:2023-12-04 07:04:36 25 4
gpt4 key购买 nike

我的困惑源于以下声明 taken from here :

When pulling patches that conflict each other (e.g., change the same part of the file) Darcs detects the conflict and marks it in the repository content. It then lets the user resolve the problem.



这似乎与我所看到的不一致,因此我使用 darcs 2.5.2 创建了以下工作流程:
  • 创建 repo foo;
  • 在foo中创建一个非空文件并记录;
  • 克隆 foo 到 bar;
  • 删除foo中的文件并记录;
  • 在bar中的文件中再添加一行并记录;
  • 从 foo 拉入 bar,获取冲突通知;

  • 采取这些步骤后,我跑了 darcs whatsnew在栏中,并显示了两个“补丁原语”:
  • 一个删除所有“foo 中的非空文件”的大块头,但没有提到在 bar 中添加和记录的行;
  • 删除文件的 rmfile。

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

    如果我运行 darcs revert在 bar 中,那么一切都说得通:根据此声明 taken from here,我看到了既不受冲突补丁影响的“非空文件”。 :

    The command darcs revert will remove the conflict marking and back up to state before conflicting patches.



    但是如果我运行 darcs mark-conflicts我回到了 pull 之后的状态,上面提到了两个“补丁原语”,没有提到在 bar 中添加和记录的行。

    作为引用/复制,这里是我从命令行的完整工作流程:
    $ 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

    最佳答案

    如果您运行 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

    现在,在那之后,我看到了 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

    所以,让我们解释一下“Remove myfile”的疯狂输出。 “删除我的文件”存在
    在 foo 中如下所示:
    Tue Nov 15 19:44:38 GMT 2011  Owen Stephens <darcs@owenstephens.co.uk>
    * Remove myfile
    hunk ./myfile 1
    -a
    rmfile ./myfile

    因此,第 1 行的一大块内容并删除了文件。

    将“remove myfile”拉入bar,我们通过引入特殊的“conflictor”原语来修改补丁内容,这些原语代表“Remove myfile”中与bar中其他原语冲突的原语。备注这里没有信息丢失——我们总是可以通过取消冲突的更改来回到原始原语——在这种情况下,取消“更改我的文件”。

    冲突者令人困惑,但 AFAICT 本质上将更改
    与当前补丁冲突,x 分为 2 组:
    “ix”是一组补丁,包括:
    i) 与存储库中的 x 和其他一些补丁冲突的补丁
    ii) 与与 x 冲突的补丁冲突的补丁
    “xx”是仅与补丁 x 冲突的补丁序列。
    我认为这样做的原因是冲突具有
    “撤销”导致冲突的原语,但只有那些没有被
    被另一个冲突者撤销。

    我们看到的输出类似于:
    "conflictor" ix "[" xx "]" x

    我在滥用符号,但希望你能在某种程度上破译(见
    src/Darcs/Patch/V2/(Real.hs|Non.hs) 在 darcs.net 存储库中的完整故事)

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

    第一个原语(从 myfile 中删除第 1 行)仅与
    “更改我的文件”中的原语(将“b”添加到我的文件的第 2 行),就是这样
    第一个冲突者:
    conflictor [    <--- The start of xx (no ix here)
    hunk ./myfile 2
    +b
    ] <--- The end of xx
    |:
    hunk ./myfile 1 <--- x
    -a

    N.B(“|:”是一个标记,它将“非”原始语的上下文与
    原始本身 - 我不会尝试进一步解释它,只需阅读以下 |:
    看到有问题的原语)

    第二个原语(删除 myfile)只是稍微复杂一点:(rmfile
    myfile) 与 (add 'b' to line 2 of myfile) 冲突,我们知道冲突
    with(从 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

    最后的 (rmfile myfile) 有一些上下文来识别确切的原语
    我们所指的(我不确定为什么/如何需要,但是
    我们在那里),它由前导“|”标记并由“|:”分隔。

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

    我认为您所看到的是强制转换“更改我的文件”和“删除我的文件”的结果 AB分别。然后为了合并两者,Darcs 创建 A^-1和通勤 A^-1BB'(A^-1)'哪里 B'具有 A^-1 的作用(因为我们强制换向工作),这意味着 B' 的影响(即合并的“删除我的文件”)实际上只是撤消“更改我的文件”所做的行的添加。

    我还没来得及看如何 darcs mark-conflicts工作,所以我还不能解释你看到的工作变化 darcs changes在酒吧。

    关于version-control - 使用 darcs 拉取已删除文件时出现冲突标记混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8141293/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com