Command line 当已经有未提交的更改时,如何使用hg命令行应用多个修补程序?
我使用以下命令在Command line 当已经有未提交的更改时,如何使用hg命令行应用多个修补程序?,command-line,mercurial,versioning,patch,Command Line,Mercurial,Versioning,Patch,我使用以下命令在Mercurial中应用补丁,而不提交它: hg import patch.diff --no-commit 它非常有效,但是如果我尝试同时应用几个补丁,如下所示: hg import patch1.diff --no-commit hg import patch2.diff --no-commit ... 我在第二次提交后收到此错误消息: abort: uncommitted changes 如果我在SourceTree中执行完全相同的操作(先应用补丁1,然后应用补丁2,
Mercurial
中应用补丁,而不提交它:
hg import patch.diff --no-commit
它非常有效,但是如果我尝试同时应用几个补丁,如下所示:
hg import patch1.diff --no-commit
hg import patch2.diff --no-commit
...
我在第二次提交后收到此错误消息:
abort: uncommitted changes
如果我在SourceTree
中执行完全相同的操作(先应用补丁1,然后应用补丁2,然后选择“修改工作副本文件”),它会起作用:将两个补丁应用于工作副本,将补丁1和补丁2的更改合并/折叠在一起
如何使用hg命令行执行相同操作?这是Mercurial作者设计的行为:假设您在工作副本中“手动”进行了未提交的更改,我们不希望
hg import
自动应用补丁,并使用错误的日志消息提交您的更改和补丁更改,这两个更改纠缠在一起
这就是为什么hg帮助导入显示:
Because import first applies changes to the working directory, import will
abort if there are outstanding changes.
import命令更适用于导入变更集(当数据来自hg export
时使用metedata),而不仅仅是应用修补程序。例如,如果您在工作副本中有自己的更改,您仍然可以使用hg import--bypass
,并且不会发生错误,因为提交直接应用于存储库而不是工作副本。(注意:但是如果您只是提交更改,您将得到两个头部,您将需要合并…-)
Unix系统的命令行解决方案是直接使用patch
命令,而不是hg import
,因为这样就不会执行本地修改检查。例如:
for i in 1 2 etc.
do
patch -p1 < patch$i.diff
done
hg commit ...
如果发生冲突,shelve
将检测到冲突,您必须解决冲突,然后告诉shelve
使用--continue
选项解决冲突
希望能有所帮助。以下是对我有效的解决方案(windows解决方案),这个想法是从克里斯托夫·穆勒(Christophe Muller)那里得到的回答:
copy /b "patch01.diff" + "patch02.diff" + ... + "patchXX.diff" "all.diff"
hg import "all.diff" --no-commit
它只是将所有补丁连接在一起(作为一个大文件),然后应用它。一个可能的解决方案是使用它(注意-似乎这个扩展“经常被认为是不推荐使用的”,但它还没有被推荐使用,并且是与Mercurial一起预装的) 如果您以前没有使用过MQ,那么如果有点复杂的话,它会非常方便。但它有效地允许您创建补丁队列,可以推送、弹出、重新排序等 您可以使用它来帮助解决您的问题,如下所示:
:: if you don't already have MQ initialised for the repo, do so
hg init --mq
:: import the patches you want as queue entries
hg qimport -P patch1.diff
hg qimport -P patch2.diff
hg qimport -P patch3.diff
-p
选项在导入更改时推动更改,这意味着您正在有效地检查它们是否正确应用。
将所有修补程序导入MQ后,将它们全部弹出(这样就不会应用任何修补程序,您就回到了开始的位置),然后将它们全部折叠到一个新的组合修补程序中:
:: go back to no patches applied, and create a new patch at the front of the queue
hg qpop --all
hg qnew -m "Your planned commit message" combined_patches
:: fold the named patches into the current one
hg qfold patch1 patch2 patch3
然后,如果您对生成的补丁感到满意,只需将其转换为“真正的”变更集:
:: convert combined_patches into a "real" changeset
hg qfinish combined_patches
我认为可能有一种更优雅的方式: (如果要先提取反向修补程序):
hg diff-c xxx——反向>1.diff
假设当前tip为TXX
关于
patch
命令:我的mercurial文件夹(windows)中没有这样的实用程序,你是说hg patch
?如果是这样的话,我在问这个问题之前已经试过了,它只是报告了与hg import
相同的错误消息,它似乎是一个Linux
实用程序,也许安装cygwin
会使它工作。我没有意识到你没有使用Unix,是的patch
是一个Unix实用程序。您可以选择:使用Cygwin版本,使用您提到的copy,或者我认为您可以使用“纯hg”解决方案,我会将其添加到我的答案中……)如果您还安装了git
,您可以使用它来进行修补,就像您的第一个方法一样:git apply
将完成这项工作。感谢您建议patch
,这正是我所需要的!Mercurial队列与Mercurial一起分发,但默认情况下未启用。如果你想知道为什么它经常被认为是不受欢迎的:@Mathiasdm:Ah,我当时一定是自己启用的:)-是的,我刚才真的在读那篇文章。
:: convert combined_patches into a "real" changeset
hg qfinish combined_patches
hg import 1.diff #creates changeset cxxx1
Hg import 2.diff #creates changeset cxxx2
Hg import 3.diff #creates changeset cxxx3
hg rebase -r cxxx1::cxxx3 -d txxx --collapse