在darcs中,如果我想重新排序到顶部(或者只是丢弃)其他补丁所依赖的补丁(即更改同一文件)该怎么办?
在git中,我只是做一个git rebase -i <UNTOUCHED-REVISION>
并重新排序或丢弃一些变化;然后git会以一种愚蠢的方式尝试将旧的变化逐一应用于树的新变体,并让我解决所产生的冲突。
在darcs中,我认为没有办法强迫它忽略补丁之间的依赖关系。如果我obliterate
或suspend
(或unrecord
)其他补丁依赖的补丁,darcs拒绝这样做。 (因为它希望以聪明的方式表现。)
答案 0 :(得分:4)
我有以下计划:
以下是关于这一切是如何进行的一些注释。
如果需要在补丁中依赖补丁修改补丁 是一个单一的&#34; minimal&#34;一个(根据依赖图), 然后你只需要命令暂停它(之后那里 将不会活跃&#34;补丁取决于重新订购 补丁):
darcs suspend -h <MINIMAL-DEPENDENT-HASH>
(并确认暂停所有其他相关补丁)。
当然,如果有几个最小的依赖补丁,你必须 暂停每个(每个子图将被要求暂停)。
首先,我看看我将要使用的变化:
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
此时制作回购的备份副本是个好主意,因为你 在未解决和解决冲突期间可能会搞砸了。
取消应该在它之前的补丁。 (不幸,
unsuspend
不支持外部合并工具。)它更好
因为你必须解决冲突,所以一个接一个地取消它们
由每个人引起并修改补丁:
darcs rebase unsuspend
# resolve conflicts
darcs amend
# repeat for the remaining patches you want to have
darcs pull ../../language-c_printAST
# resolve conflicts
darcs amend
(同样,一个接一个地做这件事会更好。)
darcs rebase unsuspend
# resolve conflicts
darcs amend
# repeat for the remaining patches you want to have
(出于某种原因,在第一次尝试时,我在最后一次失去了一个大块头 未悬挂的补丁。但是我在备份的副本中重复了所有内容 复制,然后我达到了希望的最终状态。)