Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Command line 当已经有未提交的更改时,如何使用hg命令行应用多个修补程序?_Command Line_Mercurial_Versioning_Patch - Fatal编程技术网

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