如何重新订购darcs的相关变化?

时间:2015-12-28 14:35:12

标签: patch rebase darcs

在darcs中,如果我想重新排序到顶部(或者只是丢弃)其他补丁所依赖的补丁(即更改同一文件)该怎么办?

在git中,我只是做一个git rebase -i <UNTOUCHED-REVISION>并重新排序或丢弃一些变化;然后git会以一种愚蠢的方式尝试将旧的变化逐一应用于树的新变体,并让我解决所产生的冲突。

在darcs中,我认为没有办法强迫它忽略补丁之间的依赖关系。如果我obliteratesuspend(或unrecord)其他补丁依赖的补丁,darcs拒绝这样做。 (因为它希望以聪明的方式表现。)

1 个答案:

答案 0 :(得分:4)

我有以下计划:

  1. 暂停相关补丁(依赖于补丁的补丁) 我想重新订购或扔掉。)
  2. 以某种方式取消记录重新排序的补丁并将其保存在其他地方 (也许在另一个&#34; darcs分支&#34;,即回购的副本)并恢复 工作目录的更改,以便工作目录 干净。
  3. 之后,将暂停的补丁取消挂起到州 我想要插入重新排序的补丁。 (解决所有引起的冲突。)
  4. 应用已保存的补丁(也许是从已保存的&#34;分支&#34;中拉出来的, 即,我在步骤2中保存的darcs repo的副本。
  5. 取消暂停所有剩余的补丁。 (解决所有引起的冲突。)
  6. 以下是关于这一切是如何进行的一些注释。

    1。暂停相关补丁

    如果需要在补丁中依赖补丁修改补丁 是一个单一的&#34; minimal&#34;一个(根据依赖图), 然后你只需要命令暂停它(之后那里 将不会活跃&#34;补丁取决于重新订购 补丁):

    darcs suspend -h <MINIMAL-DEPENDENT-HASH>
    

    (并确认暂停所有其他相关补丁)。

    当然,如果有几个最小的依赖补丁,你必须 暂停每个(每个子图将被要求暂停)。

    2。保存并还原不需要的更改

    制备

    首先,我看看我将要使用的变化:

    darcs diff -h 61fbb4aeac9e69cf30d232eda274c18194d7a8d9 --diff-command='emacs -f ediff-directories-with-ancestor-command %1 %2'
    

    (这种变化在逻辑上很简单,但是diff显示了它 复杂的方式,所以,在这里,我通过一个特殊的方式推出了Emacs的ediff 我为此目的写的函数。)

    我看到更改包括一些清理和添加新的 特征。因此,现在的计划是拆分它:取消记录补丁,并记录两个 补丁。

    darcs unrec -h 61fbb4aeac9e69cf30d232eda274c18194d7a8d9
    

    现在,我也可以通过ediff来查看和(也许可以)工作。

    darcs diff --diff-command='emacs -f ediff-directories-with-ancestor-command %1 %2'
    

    首先,我记录清理补丁(仅选择和编辑 相关的帅哥)。然后,添加的操作:

    darcs rec -m 'examples/Process.hs: code cleanup (present as a sequence of actions and error handling)'
    darcs rec -m 'examples/Process.hs: print the C program (from the AST) after the check (as gcc -E does)'
    

    保存为补丁(变体)

    可以使用darcs obliterate -o-O来保存已删除的内容 更改,然后使用darcs apply(根据that advice)恢复它。

    但我采取了不同的行动:

    保存为分支(变体)

    克隆不适用于已暂停补丁的回购:

    ~/TOOLS/prog/language-c $ darcs clone . ../language-c_printAST
    
    darcs failed:  Can't clone a repository with a rebase in progress
    ~/TOOLS/prog/language-c $ 
    

    所以,让我们复制一下(并检查是否允许我们拉 来自它):

    ~/TOOLS/prog/language-c $ cp -a ../language-c ../language-c_printAST
    ~/TOOLS/prog/language-c $ darcs pull ../language-c_printAST
    
    darcs failed:  Incompatibility with repository /home/imz/TOOLS/prog/language-c_printAST:
    Cannot transfer patches from a repository where a rebase is in progress
    ~/TOOLS/prog/language-c $ cd ../language-c_printAST/
    ~/TOOLS/prog/language-c_printAST $ darcs rebase obliterate
    <...>
    Really obliterate all undecided patches? y
    Rebase finished!
    ~/TOOLS/prog/language-c_printAST $ cd ../language-c
    ~/TOOLS/prog/language-c $ darcs pull ../language-c_printAST
    HINT: if you want to change the default remote repository to
          /home/imz/TOOLS/prog/language-c_printAST,
          quit now and issue the same command with the --set-default flag.
    No remote patches to pull in!
    ~/TOOLS/prog/language-c $ 
    

    好的,好的,所以我们稍后会从那个回购中撤出。

    还原更改

    丢弃不需要的(或重新订购的)补丁:

    darcs obliterate
    

    3。取消应该在它之前的补丁

    此时制作回购的备份副本是个好主意,因为你 在未解决和解决冲突期间可能会搞砸了。

    取消应该在它之前的补丁。 (不幸, unsuspend不支持外部合并工具。)它更好 因为你必须解决冲突,所以一个接一个地取消它们 由每个人引起并修改补丁:

    darcs rebase unsuspend
    # resolve conflicts
    darcs amend
    # repeat for the remaining patches you want to have
    

    4。应用保存的补丁

    darcs pull ../../language-c_printAST
    # resolve conflicts
    darcs amend
    

    5。取消所有剩余的补丁。

    (同样,一个接一个地做这件事会更好。)

    darcs rebase unsuspend
    # resolve conflicts
    darcs amend
    # repeat for the remaining patches you want to have
    

    (出于某种原因,在第一次尝试时,我在最后一次失去了一个大块头 未悬挂的补丁。但是我在备份的副本中重复了所有内容 复制,然后我达到了希望的最终状态。)