如何重新排序 darcs 中的相关更改?

How to re-order dependent changes in darcs?

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

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

在 darcs 中,我看不出有什么办法可以强制它忽略补丁之间的依赖关系。如果我 obliteratesuspend(或 unrecord)其他补丁所依赖的补丁,darcs 拒绝这样做。 (因为它想表现得聪明一些。)

我有以下计划来执行此操作:

  1. 暂停依赖的补丁(那些依赖补丁的 我想重新订购或扔掉)。
  2. 以某种方式取消记录补丁以重新排序并将其保存在其他地方 (也许在另一个 "darcs branch",即 repo 的副本中)并还原 对工作目录的更改,以便工作目录是 干净。
  3. 之后解除挂起的补丁到状态 我想插入重新订购的补丁的地方。 (解决所有产生的冲突。)
  4. 应用保存的补丁(也许,通过从保存的 "branch" 中提取, 即,我在步骤 2 中保存的 darcs 存储库的副本)。
  5. 取消挂起所有剩余的补丁程序。 (解决所有产生的冲突。)

这里有一些关于这一切是如何进行的注释。

1。挂起依赖补丁

如果在依赖补丁的补丁中你想在那里重新排序 是单个 "minimal" 一个(根据依赖关系图), 然后你只需给出暂停它的命令(然后有 将没有 "active" 个补丁,这取决于重新排序 补丁):

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 恢复它(根据 )。

但我的处理方式不同:

另存为分支(变体)

克隆对于带有暂停补丁的回购无效:

~/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

(不知为何,第一次尝试,最后一次丢了一个帅哥 未暂停的补丁。但我在备份副本中重复了所有内容 复制,然后我就达到了想要的最终状态。)