我使用以下命令在Mercurial
中应用补丁,而无需提交:
hg import patch.diff --no-commit
效果很好,但是,如果我尝试一次应用多个补丁,如下所示:
hg import patch1.diff --no-commit
hg import patch2.diff --no-commit
...
我在第二次提交后收到此错误消息:
abort: uncommitted changes
如果我在
SourceTree
中做完全相同的操作(先应用patch1,然后应用patch2,然后选择“修改工作副本文件”),则可以:将两个补丁应用于工作副本,将patch1和patch2的更改组合/折叠在一起。如何使用hg命令行执行相同的操作?
最佳答案
这是由Mercurial作者设计的行为:假设您在工作副本中“手动进行了”未提交的更改,我们不希望hg import
自动应用补丁,并且错误地提交更改和补丁更改日志消息和两个更改纠缠在一起。
这就是hg help import
说:
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 ...
对于非Unix系统,您还可以通过安装
shelve
扩展名,在全局配置文件(mercurial.ini)中启用扩展名,然后使用shelve
处理合并后的一个补丁,来获得一个纯粹的Mercurial解决方案:hg import --no-commit patch1.diff
hg shelve
hg import --no-commit patch2.diff
hg unshelve
etc.
如果发生冲突,
shelve
将检测到它,您必须解决它,然后通过shelve
选项告诉--continue
它已解决。希望能对您有所帮助。
关于command-line - 已有未提交的更改时,如何使用hg命令行应用多个补丁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26544681/