如何重新排序 darcs 中的相关更改?
How to re-order dependent changes in darcs?
在 darcs 中,如果我想重新排序到顶部(或只是丢弃)其他补丁所依赖的补丁(即更改同一文件)怎么办?
在 git 中,我会简单地做一个 git rebase -i <UNTOUCHED-REVISION>
并重新排序或丢弃一些更改;然后 git 会以一种愚蠢的方式尝试将旧的更改一个一个地应用到树的新变体,并要求我解决出现的冲突。
在 darcs 中,我看不出有什么办法可以强制它忽略补丁之间的依赖关系。如果我 obliterate
或 suspend
(或 unrecord
)其他补丁所依赖的补丁,darcs 拒绝这样做。 (因为它想表现得聪明一些。)
我有以下计划来执行此操作:
- 暂停依赖的补丁(那些依赖补丁的
我想重新订购或扔掉)。
- 以某种方式取消记录补丁以重新排序并将其保存在其他地方
(也许在另一个 "darcs branch",即 repo 的副本中)并还原
对工作目录的更改,以便工作目录是
干净。
- 之后解除挂起的补丁到状态
我想插入重新订购的补丁的地方。 (解决所有产生的冲突。)
- 应用保存的补丁(也许,通过从保存的 "branch" 中提取,
即,我在步骤 2 中保存的 darcs 存储库的副本)。
- 取消挂起所有剩余的补丁程序。 (解决所有产生的冲突。)
这里有一些关于这一切是如何进行的注释。
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
(不知为何,第一次尝试,最后一次丢了一个帅哥
未暂停的补丁。但我在备份副本中重复了所有内容
复制,然后我就达到了想要的最终状态。)
在 darcs 中,如果我想重新排序到顶部(或只是丢弃)其他补丁所依赖的补丁(即更改同一文件)怎么办?
在 git 中,我会简单地做一个 git rebase -i <UNTOUCHED-REVISION>
并重新排序或丢弃一些更改;然后 git 会以一种愚蠢的方式尝试将旧的更改一个一个地应用到树的新变体,并要求我解决出现的冲突。
在 darcs 中,我看不出有什么办法可以强制它忽略补丁之间的依赖关系。如果我 obliterate
或 suspend
(或 unrecord
)其他补丁所依赖的补丁,darcs 拒绝这样做。 (因为它想表现得聪明一些。)
我有以下计划来执行此操作:
- 暂停依赖的补丁(那些依赖补丁的 我想重新订购或扔掉)。
- 以某种方式取消记录补丁以重新排序并将其保存在其他地方 (也许在另一个 "darcs branch",即 repo 的副本中)并还原 对工作目录的更改,以便工作目录是 干净。
- 之后解除挂起的补丁到状态 我想插入重新订购的补丁的地方。 (解决所有产生的冲突。)
- 应用保存的补丁(也许,通过从保存的 "branch" 中提取, 即,我在步骤 2 中保存的 darcs 存储库的副本)。
- 取消挂起所有剩余的补丁程序。 (解决所有产生的冲突。)
这里有一些关于这一切是如何进行的注释。
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
(不知为何,第一次尝试,最后一次丢了一个帅哥 未暂停的补丁。但我在备份副本中重复了所有内容 复制,然后我就达到了想要的最终状态。)