gpt4 book ai didi

patch - 如何重新排序 darc 中的相关变化?

转载 作者:行者123 更新时间:2023-12-01 00:45:51 24 4
gpt4 key购买 nike

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

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

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

最佳答案

我有以下计划来做到这一点:

  • 挂起依赖补丁(那些依赖补丁
    我想重新订购或扔掉)。
  • 以某种方式取消记录补丁以重新排序并将其保存在其他地方
    (也许在另一个“darcs 分支”中,即 repo 的副本)并恢复
    对工作目录的更改,以便工作目录是
    干净的。
  • 之后,将挂起的补丁取消挂起到状态
    我想插入重新排序的补丁的地方。 (解决所有出现的冲突。)
  • 应用保存的补丁(也许,通过从保存的“分支”中提取,
    即,我在第 2 步中保存的 darcs 存储库的副本)。
  • 取消挂起所有剩余的补丁。 (解决所有出现的冲突。)

  • 以下是有关这一切如何进行的一些说明。

    1.挂起依赖补丁

    如果在依赖于补丁的补丁中你想在那里重新排序
    是一个“最小”的(根据依赖关系图),
    然后您只需发出暂停它的命令(然后在那里
    将没有“事件”补丁,这将取决于重新排序
    修补):
    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 $

    好的,好的,所以我们稍后会从那个 repo 中提取。

    还原更改

    扔掉不需要的(或重新排序的)补丁:
    darcs obliterate

    3.取消挂起应该在它之前的补丁

    此时最好制作一份 repo 的备份副本,因为您
    在取消暂停和解决冲突期间可能会搞砸一些事情。

    取消挂起应该在它之前的补丁。 (很遗憾, 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

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

    关于patch - 如何重新排序 darc 中的相关变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34495458/

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